react-deep-link
Version:
A React-compatible deep linking library for cross-domain UI state sharing.
68 lines (67 loc) • 2.41 kB
JavaScript
;
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;