@atlaskit/popup
Version:
A popup displays brief content in an overlay.
60 lines (58 loc) • 1.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useRoleProps = useRoleProps;
var _react = require("react");
/**
* Props shape passed from legacy `role` / `label` / `titleId` into `@atlaskit/top-layer` `Popup.Content`.
*
* The `{ role: undefined }` variant covers the legacy contract where a
* consumer omits `role` to opt out of any popup semantics (and the
* associated role-based initial-focus movement). Legacy `Popup` left the
* popup element role-less in that case; we preserve that behaviour here
* rather than defaulting to `'dialog'`, which would move focus into the
* popup on open.
*/
/**
* Maps legacy popup role/label/titleId props to the discriminated union
* that `Popup.Content` expects.
*
* `Popup.Content` enforces at the type level that dialog/alertdialog/menu
* roles must have `label` or `labelledBy`. This hook bridges the legacy
* flat-prop API (`role`, `label`, `titleId`) to that shape.
*
* When `role` is omitted entirely, the result carries `role: undefined`
* (no implicit default). This matches the legacy `Popup` contract and
* keeps the underlying `Popover` from running role-based initial focus.
*/
function useRoleProps(_ref) {
var role = _ref.role,
label = _ref.label,
titleId = _ref.titleId;
return (0, _react.useMemo)(function () {
if (role === 'dialog' || role === 'alertdialog' || role === 'menu') {
if (titleId) {
return {
role: role,
labelledBy: titleId
};
}
return {
role: role,
label: label !== null && label !== void 0 ? label : 'Popup'
};
}
if (role) {
return {
role: role,
label: label
};
}
// No role supplied: preserve the legacy "no popup semantics" contract.
return {
role: undefined,
label: label
};
}, [role, label, titleId]);
}