Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | 12x 12x 2x 2x 2x 12x | import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import cx from 'classnames';
import * as R from 'ramda';
import Clear from '@material-ui/icons/Clear';
import ArrowForward from '@material-ui/icons/ArrowForward';
import ArrowBack from '@material-ui/icons/ArrowBack';
import Search from '@material-ui/icons/Search';
import Paper from '@material-ui/core/Paper';
import IconButton from '@material-ui/core/IconButton';
import InputBase from '@material-ui/core/InputBase';
import Divider from '@material-ui/core/Divider';
import { Field } from './Fields';
import { useStyles } from './useStyles';
import { useSpotlight } from './useSpotlight';
 
const size = R.pipe(R.values, R.length);
 
const Spotlight = ({
  placeholder,
  hasClearAll,
  isRtl,
  hasCommit,
  withBorder,
  defaultSpotlight,
  defaultTerm,
  action,
  fullWidth,
  className,
}) => {
  const {
    term,
    spotlight,
    isFocus,
    onKeyPress,
    onClearTerm,
    onChangeTerm,
    onChangeField,
    onCommitTerm,
    setFocus,
  } = useSpotlight(hasCommit, defaultTerm, defaultSpotlight, action);
  const classes = useStyles();
 
  return (
    <div
      className={cx(R.prop('container', className), {
        [classes.container]: withBorder,
        [classes.containerFocus]: isFocus,
        [classes.fullWith]: fullWidth,
        [classes.defaultWidth]: !fullWidth,
      })}
    >
      <Paper className={classes.root} elevation={0}>
        <IconButton className={classes.leftIcon} disabled aria-label="search">
          <Search />
        </IconButton>
        <InputBase
          className={classes.input}
          classes={{ root: classes.inputBase, input: classes.inputBaseMargin }}
          placeholder={placeholder}
          onKeyPress={onKeyPress}
          value={term}
          onChange={onChangeTerm}
          onFocus={() => setFocus(true)}
          onBlur={() => setFocus(false)}
        />
        {hasClearAll && !R.isEmpty(term) ? (
          <IconButton aria-label="Clear" onClick={onClearTerm} className={classes.rightIcon}>
            <Clear />
          </IconButton>
        ) : null}
        {R.gt(size(R.prop('fields', spotlight)), 1) ? (
          <Fragment>
            <Divider className={classes.divider} />
            <Field
              spotlight={spotlight}
              onChangeField={onChangeField}
              isRtl={isRtl}
              term={term}
              classes={classes}
            />
          </Fragment>
        ) : null}
        {hasCommit ? (
          <Fragment>
            <Divider className={classes.divider} />
            <IconButton
              disabled={R.isEmpty(term)}
              color="primary"
              className={classes.rightIcon}
              aria-label="commit"
              onClick={onCommitTerm}
            >
              {isRtl ? <ArrowBack /> : <ArrowForward />}
            </IconButton>
          </Fragment>
        ) : null}
      </Paper>
    </div>
  );
};
 
Spotlight.propTypes = {
  defaultTerm: PropTypes.string,
  placeholder: PropTypes.string,
  defaultSpotlight: PropTypes.shape({
    fields: PropTypes.object,
    searchLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
    FieldLabelRenderer: PropTypes.func,
  }),
  action: PropTypes.func,
  hasClearAll: PropTypes.bool,
  isRtl: PropTypes.bool,
  hasCommit: PropTypes.bool,
  withBorder: PropTypes.bool,
  fullWidth: PropTypes.bool,
  classes: PropTypes.object,
  className: PropTypes.string,
};
 
export default Spotlight;
  |