UNPKG

@atlaskit/editor-common

Version:

A package that contains common classes and components for editor and renderer

212 lines 5.71 kB
import _defineProperty from "@babel/runtime/helpers/defineProperty"; import React from 'react'; import { injectIntl } from 'react-intl-next'; import { INPUT_METHOD } from '../../analytics'; import LinkSearchList from './LinkSearchList'; import withActivityProvider from './withActivityProvider'; const DEFAULT_ITEMS_LIMIT = 5; const limit = (items, max) => { return items.slice(0, max); }; class RecentLink extends React.Component { constructor(props) { super(props); _defineProperty(this, "activityProvider", null); _defineProperty(this, "handleSubmit", () => { const { items, url, selectedIndex } = this.state; const inputMethod = this.getCurrentInputMethod(); if (!inputMethod) { return; // No call submit, if there is nothing to submit } switch (inputMethod) { case INPUT_METHOD.MANUAL: { this.props.onSubmit({ url, text: url, inputMethod: INPUT_METHOD.MANUAL }); break; } case INPUT_METHOD.TYPEAHEAD: { const item = items[selectedIndex]; this.setState(() => ({ url: item.url })); if (this.props.onSubmit) { this.props.onSubmit({ url: item.url, text: item.name, inputMethod: INPUT_METHOD.TYPEAHEAD }); } break; } } }); _defineProperty(this, "handleSelected", (href, text) => { if (this.props.onSubmit) { this.setState(() => ({ url: href })); this.props.onSubmit({ text, url: href, inputMethod: INPUT_METHOD.TYPEAHEAD }); } }); _defineProperty(this, "handleChange", async input => { this.setState({ url: input }); if (this.activityProvider) { if (input.length === 0) { this.setState({ items: limit(await this.activityProvider.getRecentItems(), this.props.limit), selectedIndex: -1 }); } else { this.setState({ items: limit(await this.activityProvider.searchRecent(input), this.props.limit), selectedIndex: 0 }); } } }); _defineProperty(this, "handleKeyDown", e => { const { items, selectedIndex } = this.state; if (!items || !items.length) { return; } if (e.key === 'ArrowDown') { // down e.preventDefault(); this.setState({ selectedIndex: (selectedIndex + 1) % items.length }); } else if (e.key === 'ArrowUp') { // up e.preventDefault(); this.setState({ selectedIndex: selectedIndex > 0 ? selectedIndex - 1 : items.length - 1 }); } }); _defineProperty(this, "handleMouseMove", objectId => { const { items } = this.state; if (items) { const index = items.findIndex(item => item.objectId === objectId); this.setState({ selectedIndex: index }); } }); _defineProperty(this, "renderRecentList", () => { const { items, isLoading, selectedIndex } = this.state; return /*#__PURE__*/React.createElement(LinkSearchList, { items: items, isLoading: isLoading, selectedIndex: selectedIndex, onSelect: this.handleSelected, onMouseMove: this.handleMouseMove }); }); _defineProperty(this, "clearValue", () => { this.setState({ url: '' }); }); this.state = { selectedIndex: -1, isLoading: false, items: [], url: props.defaultUrl || '' }; } UNSAFE_componentWillReceiveProps(nextProps) { if (this.props.defaultUrl !== nextProps.defaultUrl) { this.setState(state => { if (state.url !== nextProps.defaultUrl) { return { items: [], selectedIndex: -1, url: nextProps.defaultUrl || '' }; } return null; }); } } async componentDidMount() { if (this.props.activityProvider) { this.activityProvider = await this.props.activityProvider; await this.loadRecentItems(this.activityProvider); } } async loadRecentItems(activityProvider) { try { if (!this.state.url) { this.setState({ isLoading: true, items: limit(await activityProvider.getRecentItems(), this.props.limit) // defaultProps assure that limit always contains a value }); } } finally { this.setState({ isLoading: false }); } } getCurrentInputMethod() { const { items, url, selectedIndex } = this.state; if (items && items.length > 0 && selectedIndex > -1) { return INPUT_METHOD.TYPEAHEAD; } else if (url && url.length > 0) { return INPUT_METHOD.MANUAL; } return; } render() { const { render } = this.props; const { url } = this.state; return render({ activityProvider: this.activityProvider, inputProps: { onChange: this.handleChange, onKeyDown: this.handleKeyDown, onSubmit: this.handleSubmit, value: url }, clearValue: this.clearValue, currentInputMethod: this.getCurrentInputMethod(), renderRecentList: this.renderRecentList }); } } _defineProperty(RecentLink, "defaultProps", { limit: DEFAULT_ITEMS_LIMIT }); export default withActivityProvider(injectIntl(RecentLink));