UNPKG

@koordinates/xstate-tree

Version:

Build UIs with Actors using xstate and React

79 lines (78 loc) 3.35 kB
"use strict"; 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);