// Package imports. import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; import { connect } from 'react-redux'; import spring from 'react-motion/lib/spring'; import { injectIntl, FormattedMessage, defineMessages, } from 'react-intl'; import Overlay from 'react-overlays/lib/Overlay'; // Components. import Icon from 'flavours/glitch/components/icon'; // Utils. import { focusRoot } from 'flavours/glitch/utils/dom_helpers'; import { searchEnabled } from 'flavours/glitch/initial_state'; import Motion from '../../ui/util/optional_motion'; const messages = defineMessages({ placeholder: { id: 'search.placeholder', defaultMessage: 'Search' }, }); class SearchPopout extends React.PureComponent { static propTypes = { style: PropTypes.object, }; render () { const { style } = this.props; const extraInformation = searchEnabled ? : ; return (
{({ opacity, scaleX, scaleY }) => (

  • #example
  • @username@domain
  • URL
  • URL
{extraInformation}
)}
); } } // The component. export default @injectIntl class Search extends React.PureComponent { static contextTypes = { router: PropTypes.object.isRequired, }; static propTypes = { value: PropTypes.string.isRequired, submitted: PropTypes.bool, onChange: PropTypes.func.isRequired, onSubmit: PropTypes.func.isRequired, onClear: PropTypes.func.isRequired, onShow: PropTypes.func.isRequired, openInRoute: PropTypes.bool, intl: PropTypes.object.isRequired, singleColumn: PropTypes.bool, }; state = { expanded: false, }; setRef = c => { this.searchForm = c; } handleChange = (e) => { const { onChange } = this.props; if (onChange) { onChange(e.target.value); } } handleClear = (e) => { const { onClear, submitted, value, } = this.props; e.preventDefault(); // Prevents focus change ?? if (onClear && (submitted || value && value.length)) { onClear(); } } handleBlur = () => { this.setState({ expanded: false }); } handleFocus = () => { this.setState({ expanded: true }); this.props.onShow(); if (this.searchForm && !this.props.singleColumn) { const { left, right } = this.searchForm.getBoundingClientRect(); if (left < 0 || right > (window.innerWidth || document.documentElement.clientWidth)) { this.searchForm.scrollIntoView(); } } } handleKeyUp = (e) => { const { onSubmit } = this.props; switch (e.key) { case 'Enter': onSubmit(); if (this.props.openInRoute) { this.context.router.history.push('/search'); } break; case 'Escape': focusRoot(); } } render () { const { intl, value, submitted } = this.props; const { expanded } = this.state; const hasValue = value.length > 0 || submitted; return (
); } }