@koordinates/xstate-tree
Version:
Build UIs with Actors using xstate and React
79 lines (78 loc) • 3.35 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Link = void 0;
const react_1 = __importStar(require("react"));
const useHref_1 = require("./useHref");
function LinkInner({ to, children, testId, preloadOnHoverMs, preloadOnInteraction, onMouseDown: _onMouseDown, onMouseEnter: _onMouseEnter, onMouseLeave: _onMouseLeave, ...rest }, ref) {
// @ts-ignore, these fields _might_ exist, so typechecking doesn't believe they exist
// and everything that consumes params/query already checks for undefined
const { params, query, meta, ...props } = rest;
let timeout;
const href = (0, useHref_1.useHref)(to, params, query);
const onMouseDown = preloadOnInteraction
? (e) => {
_onMouseDown?.(e);
to.preload({ params, query, meta });
}
: undefined;
const onMouseEnter = preloadOnHoverMs !== undefined
? (e) => {
_onMouseEnter?.(e);
timeout = setTimeout(() => {
to.preload({ params, query, meta });
}, preloadOnHoverMs);
}
: undefined;
const onMouseLeave = preloadOnHoverMs !== undefined
? (e) => {
_onMouseLeave?.(e);
if (timeout !== undefined) {
clearTimeout(timeout);
}
}
: undefined;
return (react_1.default.createElement("a", { ...props, ref: ref, href: href, "data-testid": testId, onMouseDown: onMouseDown ?? _onMouseDown, onMouseEnter: onMouseEnter ?? _onMouseEnter, onMouseLeave: onMouseLeave ?? _onMouseLeave, "data-xstate-tree": true, onClick: (e) => {
if (props.onClick?.(e) === false) {
return;
}
// Holding the Command key on Mac or the Control Key on Windows while clicking the link will open a new tab/window
// TODO: add global callback to prevent this
if (e.metaKey || e.ctrlKey) {
return;
}
e.preventDefault();
to.navigate({ params, query, meta });
} }, children));
}
/**
* @public
*
* Renders an anchor tag pointing at the provided Route
*
* The query/params/meta props are conditionally required based on the
* route passed as the To parameter
*/
exports.Link = (0, react_1.forwardRef)(LinkInner);