UNPKG

@veracity/vui

Version:

Veracity UI is a React component library crafted for use within Veracity applications and pages. Based on Styled Components and @xstyled.

79 lines (77 loc) 2.56 kB
import { cdnUrls } from "./consts.js"; import { isObject } from "../utils/assertion.js"; import { noop } from "../utils/function.js"; import { useCallbackRef } from "../utils/react.js"; import { createContext, useContext, useEffect, useState } from "react"; import { jsx } from "react/jsx-runtime"; //#region src/core/links.tsx const LinksContext = createContext(void 0); /** * Adds loggedIn=1 parameter to the URL if 'isLoggedIn' flag is true, which means the user is logged in. * If 'isLoggedIn' is falsy, loggedin param will be removed. * This is supposed to aid login flow when navigating between Veracity applications. */ function getLoggedInLink(link, isLoggedIn) { try { const url = new URL(link); if (isLoggedIn) url.searchParams.append("loggedin", "1"); else url.searchParams.delete("loggedin"); return url.toString(); } catch { return link; } } function LinksProvider(props) { const linksState = useState({}); return /* @__PURE__ */ jsx(LinksContext.Provider, { value: linksState, ...props }); } /** Returns links and setLinks from LinksContext. */ function useLinks() { const context = useContext(LinksContext); if (context === void 0) { console.error("useLinks must be used within a LinksContext."); return [{}, noop]; } return context; } /** * Retrieves the links from CDN for the given environment and appends them with loggedin=1 parameter * if user is logged in. Links will be reloaded when 'env' changes or updated when 'isLoggedIn' changes. */ function useLoadLinks(env, isLoggedIn) { const [, setLinks] = useLinks(); const loadLinks = async (env) => { try { const response = await fetch(`${cdnUrls[env]}/common/data/links/base.json`); if (!response.ok) return; const data = await response.json(); if (isObject(data)) setLinks(updateLoggedInParam(data)); } catch { console.error("Failed to retrieve links"); } }; /** * Adds/removes loggedin=1 URL param for each link based on isLoggedIn arg. * useCallbackRef is used here to prevent a stale closure in async loadLinks. */ const updateLoggedInParam = useCallbackRef((links) => { return Object.keys(links).reduce((loggedInLinks, key) => { loggedInLinks[key] = getLoggedInLink(links[key], isLoggedIn); return loggedInLinks; }, {}); }); useEffect(() => { if (!env) return; loadLinks(env); }, [env]); useEffect(() => { setLinks(updateLoggedInParam); }, [isLoggedIn]); } //#endregion export { LinksProvider, getLoggedInLink, useLinks, useLoadLinks }; globalThis.__vuiVersion__ = "5.3.1" //# sourceMappingURL=links.js.map