@nature-ui/clickable
Version:
React hook and component that implements native button interactions
180 lines (178 loc) • 5.66 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/use-clickable.tsx
var use_clickable_exports = {};
__export(use_clickable_exports, {
useClickable: () => useClickable
});
module.exports = __toCommonJS(use_clickable_exports);
var import_utils = require("@nature-ui/utils");
var import_react = __toESM(require("react"));
var useClickable = (props = {}) => {
const {
ref: htmlRef,
isDisabled,
isFocusable,
clickOnEnter = true,
clickOnSpace = true,
onMouseDown,
onMouseUp,
onClick,
onKeyDown,
onKeyUp,
tabIndex: tabIndexProp,
onMouseOver,
...htmlProps
} = props;
const [isButton, setIsButton] = import_react.default.useState(true);
const [isActive, setIsActive] = import_react.default.useState(false);
const refCallback = import_react.default.useCallback((node) => {
if ((node == null ? void 0 : node.tagName) !== "BUTTON") {
setIsButton(false);
}
}, []);
const tabIndex = isButton ? tabIndexProp : tabIndexProp || 0;
const trulyDisabled = isDisabled && !isFocusable;
const handleClick = import_react.default.useCallback(
(event) => {
if (isDisabled) {
event.stopPropagation();
event.preventDefault();
return;
}
const selft = event.currentTarget;
selft.focus();
onClick == null ? void 0 : onClick(event);
},
[isDisabled, onClick]
);
const handleKeyDown = import_react.default.useCallback(
(event) => {
onKeyDown == null ? void 0 : onKeyDown(event);
if (isDisabled || event.defaultPrevented || event.metaKey) {
return;
}
const shouldClickOnEnter = clickOnEnter && event.key === "Enter";
const shouldClickOnSpace = clickOnSpace && event.key === " ";
if (!isButton && shouldClickOnSpace) {
event.preventDefault();
setIsActive(true);
return;
}
if (!isButton && shouldClickOnEnter) {
event.preventDefault();
const self = event.currentTarget;
self.click();
}
},
[isDisabled, isButton, onKeyDown, clickOnEnter, clickOnSpace]
);
const handleKeyUp = import_react.default.useCallback(
(event) => {
onKeyUp == null ? void 0 : onKeyUp(event);
if (isDisabled || event.defaultPrevented || event.metaKey)
return;
const shouldClickOnSpace = clickOnSpace && event.key === " ";
if (!isButton && shouldClickOnSpace) {
event.preventDefault();
setIsActive(false);
const self = event.currentTarget;
self.click();
}
},
[clickOnSpace, isButton, isDisabled, onKeyUp]
);
const handleMouseDown = import_react.default.useCallback(
(event) => {
if (isDisabled) {
event.stopPropagation();
event.preventDefault();
return;
}
if (!isButton) {
setIsActive(true);
}
onMouseDown == null ? void 0 : onMouseDown(event);
},
[isDisabled, isButton, onMouseDown]
);
const handleMouseUp = import_react.default.useCallback(
(event) => {
if (!isButton) {
setIsActive(false);
}
onMouseUp == null ? void 0 : onMouseUp(event);
},
[onMouseUp, isButton]
);
const handleMouseOver = import_react.default.useCallback(
(event) => {
if (isDisabled) {
event.preventDefault();
return;
}
onMouseOver == null ? void 0 : onMouseOver(event);
},
[isDisabled, onMouseOver]
);
const ref = (0, import_utils.mergeRefs)(htmlRef, refCallback);
if (isButton) {
return {
...htmlProps,
ref,
type: "button",
"aria-disabled": trulyDisabled ? void 0 : isDisabled,
disabled: trulyDisabled,
onClick: handleClick,
onMouseDown,
onMouseUp,
onKeyUp,
onKeyDown,
onMouseOver
};
}
return {
...htmlProps,
ref,
role: "button",
"data-active": (0, import_utils.dataAttr)(isActive),
"aria-disabled": Boolean(isDisabled),
tabIndex: trulyDisabled ? void 0 : tabIndex,
onClick: handleClick,
onMouseDown: handleMouseDown,
onMouseUp: handleMouseUp,
onKeyUp: handleKeyUp,
onKeyDown: handleKeyDown,
onMouseOver: handleMouseOver
};
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
useClickable
});