UNPKG

react-deep-link

Version:

A React-compatible deep linking library for cross-domain UI state sharing.

68 lines (67 loc) 2.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RedirectToExternal = exports.useDeepLink = exports.parseDeepLink = exports.generateDeepLink = exports.decryptState = exports.encryptState = void 0; const tslib_1 = require("tslib"); const react_1 = tslib_1.__importStar(require("react")); const SECRET = "ALVBSLRGIBLSIUHRG395HGO4539RUFSIEVUGNBS4L8HGIWUN"; const encryptState = (state) => { const json = JSON.stringify(state); const buffer = new TextEncoder().encode(json); return btoa(buffer.reduce((data, byte) => data + String.fromCharCode(byte ^ SECRET.charCodeAt(0)), "")); }; exports.encryptState = encryptState; const decryptState = (encoded) => { const decoded = atob(encoded); const decrypted = new TextDecoder().decode(Uint8Array.from(decoded, (c) => c.charCodeAt(0) ^ SECRET.charCodeAt(0))); return JSON.parse(decrypted); }; exports.decryptState = decryptState; const generateDeepLink = ({ baseUrl, route, params, state, }) => { const url = new URL(`${baseUrl}${route}`); if (params) { Object.entries(params).forEach(([key, value]) => { url.searchParams.set(key, value); }); } if (state) { const encrypted = (0, exports.encryptState)(state); url.searchParams.set("state", encrypted); } return url.toString(); }; exports.generateDeepLink = generateDeepLink; const parseDeepLink = (searchParams) => { const result = { fallback: false }; for (const [key, value] of searchParams.entries()) { if (key === "state") { try { result.state = (0, exports.decryptState)(value); } catch (e) { result.state = undefined; result.fallback = true; } } else { result[key] = value; } } return result; }; exports.parseDeepLink = parseDeepLink; const useDeepLink = () => { return (0, react_1.useMemo)(() => { const params = new URLSearchParams(window.location.search); return (0, exports.parseDeepLink)(params); }, [window.location.search]); }; exports.useDeepLink = useDeepLink; class RedirectToExternal extends react_1.default.Component { componentDidMount() { window.location.href = this.props.to; } render() { return null; } } exports.RedirectToExternal = RedirectToExternal;