materialuiupgraded
Version:
Material-UI's workspace package
197 lines (183 loc) • 5.51 kB
JavaScript
import React from 'react';
import keycode from 'keycode';
import compose from 'recompose/compose';
import EventListener from 'react-event-listener';
import PropTypes from 'prop-types';
import Router from 'next/router';
import withWidth, { isWidthUp } from '@material-ui/core/withWidth';
import Input from '@material-ui/core/Input';
import SearchIcon from '@material-ui/icons/Search';
import { fade } from '@material-ui/core/styles/colorManipulator';
import { withStyles } from '@material-ui/core/styles';
let searchTimer;
let initialized = false;
function initDocsearch() {
if (!process.browser) {
return;
}
clearInterval(searchTimer);
searchTimer = setInterval(() => {
const docsearchInput = document.querySelector('#docsearch-input');
if (!window.docsearch || !docsearchInput) {
return;
}
if (initialized === docsearchInput) {
clearInterval(searchTimer);
return;
}
initialized = docsearchInput;
clearInterval(searchTimer);
window.docsearch({
apiKey: '1d8534f83b9b0cfea8f16498d19fbcab',
indexName: 'material-ui',
inputSelector: '#docsearch-input',
handleSelected: (input, event, suggestion) => {
const url = suggestion.url
.replace(/^https:\/\/material-ui\.com/, '')
.replace(/\/#/, '#')
.replace(/\/$/, '');
Router.push(url);
},
// Set debug to true if you want to inspect the dropdown.
debug: true,
});
}, 100);
}
const styles = theme => ({
'@global': {
'.algolia-autocomplete': {
fontFamily: theme.typography.fontFamily,
'& .algolia-docsearch-suggestion--category-header-lvl0': {
color: theme.palette.text.primary,
},
'& .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column': {
opacity: 1,
padding: '5.33px 10.66px',
textAlign: 'right',
width: '30%',
'&:before': {
display: 'block',
},
'&:after': {
display: 'none',
},
},
'& .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content': {
float: 'right',
padding: '5.33px 0 5.33px 10.66px',
width: '70%',
'&:before': {
display: 'block',
},
},
'& .algolia-docsearch-suggestion--subcategory-column-text': {
color: theme.palette.text.secondary,
fontWeight: theme.typography.fontWeightRegular,
},
'& .algolia-docsearch-suggestion--highlight': {
color: theme.palette.type === 'light' ? '#174d8c' : '#acccf1',
},
'& .algolia-docsearch-suggestion': {
background: 'transparent',
},
'& .algolia-docsearch-suggestion--title': {
...theme.typography.h6,
},
'& .algolia-docsearch-suggestion--text': {
...theme.typography.body2,
},
'& .ds-dropdown-menu': {
boxShadow: theme.shadows[1],
borderRadius: 2,
'&::before': {
display: 'none',
},
'& [class^=ds-dataset-]': {
border: 0,
borderRadius: 2,
backgroundColor: theme.palette.background.paper,
},
},
},
},
root: {
fontFamily: theme.typography.fontFamily,
position: 'relative',
marginRight: theme.spacing.unit * 2,
marginLeft: theme.spacing.unit,
borderRadius: theme.shape.borderRadius,
backgroundColor: fade(theme.palette.common.white, 0.15),
'&:hover': {
backgroundColor: fade(theme.palette.common.white, 0.25),
},
'& $inputInput': {
transition: theme.transitions.create('width'),
width: 120,
'&:focus': {
width: 170,
},
},
},
search: {
width: theme.spacing.unit * 9,
height: '100%',
position: 'absolute',
pointerEvents: 'none',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
},
inputRoot: {
color: 'inherit',
},
inputInput: {
padding: `${theme.spacing.unit}px ${theme.spacing.unit}px ${theme.spacing.unit}px ${theme
.spacing.unit * 9}px`,
},
});
class AppSearch extends React.Component {
handleKeyDown = event => {
if (
['/', 's'].indexOf(keycode(event)) !== -1 &&
document.activeElement.nodeName.toLowerCase() === 'body' &&
document.activeElement !== this.inputRef
) {
event.preventDefault();
this.inputRef.focus();
}
};
render() {
const { classes, width } = this.props;
if (isWidthUp('sm', width)) {
initDocsearch();
}
return (
<div className={classes.root} style={{ display: isWidthUp('sm', width) ? 'block' : 'none' }}>
<EventListener target="window" onKeyDown={this.handleKeyDown} />
<div className={classes.search}>
<SearchIcon />
</div>
<Input
disableUnderline
placeholder="Search…"
id="docsearch-input"
inputRef={ref => {
this.inputRef = ref;
}}
classes={{
root: classes.inputRoot,
input: classes.inputInput,
}}
/>
</div>
);
}
}
AppSearch.propTypes = {
classes: PropTypes.object.isRequired,
width: PropTypes.string.isRequired,
};
export default compose(
withStyles(styles),
withWidth(),
)(AppSearch);