@atlaskit/editor-common
Version:
A package that contains common classes and components for editor and renderer
153 lines • 5.47 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
/** @jsx jsx */
import React, { memo, useLayoutEffect, useRef, useState } from 'react';
import { css, jsx } from '@emotion/react';
import { injectIntl } from 'react-intl-next';
import { withAnalyticsContext } from '@atlaskit/analytics-next';
import { relativeFontSizeToBase16 } from '@atlaskit/editor-shared-styles';
import { shortcutStyle } from '@atlaskit/editor-shared-styles/shortcut';
import SearchIcon from '@atlaskit/icon/glyph/search';
import Textfield from '@atlaskit/textfield';
import { N200 } from '@atlaskit/theme/colors';
import { GRID_SIZE, SEARCH_ITEM_HEIGHT_WIDTH } from '../constants';
import useFocus from '../hooks/use-focus';
import commonMessages from '../messages';
import { Modes } from '../types';
function ElementSearch(_ref) {
var onSearch = _ref.onSearch,
mode = _ref.mode,
formatMessage = _ref.intl.formatMessage,
focus = _ref.focus,
onClick = _ref.onClick,
onKeyDown = _ref.onKeyDown,
searchTerm = _ref.searchTerm,
items = _ref.items,
selectedItemIndex = _ref.selectedItemIndex;
var ref = useFocus(focus);
var assistiveTextRef = useRef(null);
var _useState = useState(false),
_useState2 = _slicedToArray(_useState, 2),
inputFocused = _useState2[0],
setInputFocused = _useState2[1];
useLayoutEffect(function () {
if (assistiveTextRef) {
var assistiveDiv = assistiveTextRef.current;
/**
* We need to remove and set attributes, for the proper working of screen readers.
*/
assistiveDiv === null || assistiveDiv === void 0 || assistiveDiv.removeAttribute('aria-live');
assistiveDiv === null || assistiveDiv === void 0 || assistiveDiv.setAttribute('aria-live', 'polite');
}
}, [items, formatMessage]);
var onChange = function onChange(_ref2) {
var value = _ref2.target.value;
onSearch(value);
};
var onFocus = function onFocus(e) {
setInputFocused(true);
};
var onBlur = function onBlur(e) {
setInputFocused(false);
};
var getFormattedMessage = function getFormattedMessage(itemsCount) {
if (searchTerm === '') {
return "".concat(formatMessage(commonMessages.assistiveTextDefault, {
count: itemsCount
}));
}
if (itemsCount > 1) {
return "".concat(formatMessage(commonMessages.assistiveTextResult, {
count: itemsCount
}));
}
if (itemsCount === 1) {
return "".concat(formatMessage(commonMessages.assistiveTextResult, {
count: itemsCount
}));
}
return formatMessage(commonMessages.assistiveTextResult, {
count: itemsCount
});
};
var assistiveMessage = getFormattedMessage(items === null || items === void 0 ? void 0 : items.length);
var isInputNotFocusedAndItemSelected = !inputFocused && selectedItemIndex !== undefined;
var ariaActiveDescendant = isInputNotFocusedAndItemSelected ? "searched-item-".concat(selectedItemIndex) : undefined;
return jsx("div", {
css: [wrapper, mode === Modes.inline && wrapperInline]
}, jsx(Textfield, {
ref: ref,
onChange: onChange,
onClick: onClick,
onFocus: onFocus,
onKeyDown: onKeyDown,
onBlur: onBlur,
elemBeforeInput: jsx("div", {
css: elementBeforeInput,
"data-testid": "element_search__element_before_input",
"aria-hidden": "true"
}, jsx(SearchIcon, {
size: "medium",
label: "Advanced search",
primaryColor: "inherit"
})),
elemAfterInput: jsx("div", {
css: elementAfterInput,
"data-testid": "element_search__element_after_input"
}, jsx("div", {
css: styledShortcut
}, "\u23CE ", formatMessage(commonMessages.elementAfterInputMessage))),
placeholder: formatMessage(commonMessages.placeHolderMessage),
"aria-label": "search",
"aria-labelledby": "search-assistive",
className: "js-search-input",
role: "combobox",
"aria-activedescendant": ariaActiveDescendant,
value: searchTerm
}), jsx("span", {
id: "search-assistive",
ref: assistiveTextRef,
"aria-live": "polite",
"aria-atomic": "true",
className: "assistive"
}, assistiveMessage));
}
var styledShortcut = css(shortcutStyle, {
padding: "var(--ds-space-050, 4px)".concat(" ", "var(--ds-space-100, 8px)"),
width: "var(--ds-space-600, 48px)"
});
var wrapper = css({
'& > [data-ds--text-field--container]': {
height: "".concat(GRID_SIZE * 6, "px"),
borderRadius: "".concat(GRID_SIZE, "px"),
flex: '1 1 100%',
overflow: 'visible',
'& > [data-ds--text-field--input]': {
fontSize: relativeFontSizeToBase16(14),
padding: "var(--ds-space-100, 8px)".concat(" ", "var(--ds-space-075, 6px)", " ", "var(--ds-space-100, 8px)", " 0")
}
}
});
var wrapperInline = css({
'& > [data-ds--text-field--container]': {
height: "".concat(GRID_SIZE * 5, "px"),
flex: 'none',
overflow: 'revert'
}
});
var elementBeforeInput = css({
margin: "1px ".concat("var(--ds-space-075, 6px)", " 0 ", "var(--ds-space-100, 8px)"),
color: "var(--ds-icon, ".concat(N200, ")"),
'span, svg': {
height: '20px',
width: '20px'
}
});
var elementAfterInput = css({
margin: "0 ".concat("var(--ds-space-100, 8px)"),
height: SEARCH_ITEM_HEIGHT_WIDTH,
textAlign: 'center'
});
var MemoizedElementSearchWithAnalytics = /*#__PURE__*/memo(withAnalyticsContext({
component: 'Searchbar'
})(injectIntl(ElementSearch)));
export default MemoizedElementSearchWithAnalytics;