diff --git a/js/actions.js b/js/actions.js
index 650f22b..d0a7b00 100644
--- a/js/actions.js
+++ b/js/actions.js
@@ -1,10 +1,11 @@
export const NAVIGATE = 'navigate';
const actions = {
- navigate: (pageName, pushToHistory = true) => {
+ navigate: (pageName, pushToHistory = true, pageState = {}) => {
return {
type: NAVIGATE,
pageName,
+ pageState,
pushToHistory,
};
},
diff --git a/js/components/App.js b/js/components/App.js
index f11ee96..b35d955 100644
--- a/js/components/App.js
+++ b/js/components/App.js
@@ -26,6 +26,6 @@ function App(props) {
}
export default connect(
- ({ items, releases, pageName }) => ({ items, releases, pageName }),
+ ({ items, releases, pageName, pageState }) => ({ items, releases, pageName, pageState }),
actions
)(App);
diff --git a/js/components/Header.js b/js/components/Header.js
index aed6152..c94aa68 100644
--- a/js/components/Header.js
+++ b/js/components/Header.js
@@ -1,16 +1,20 @@
import React from 'react';
import classNames from 'classnames';
+import { connect } from 'react-redux';
+
import Branding from './Branding';
import Link from './Link';
import LogoLink from './LogoLink';
import Search from './Search';
import { getItemPageNames } from '../../common/config';
+import actions from '../actions';
class Header extends React.Component {
constructor(...args) {
super(...args);
this.state = {
searchOpen: false,
+ search: '',
};
}
@@ -26,9 +30,29 @@ class Header extends React.Component {
});
}
+ handleSearchChange = (search) => {
+ this.setState({
+ search,
+ });
+ }
+
+ handleSearchSubmit = () => {
+ this.props.navigate('overview', true, {
+ search: this.state.search,
+ });
+
+ this.setState({
+ searchOpen: false,
+ search: '',
+ });
+ }
+
handleOpenClick = (e) => {
e.preventDefault();
this.openSearch();
+ setTimeout(() => {
+ this.search.focus();
+ }, 0);
}
render() {
@@ -56,7 +80,14 @@ class Header extends React.Component {
Search
-
+ { this.search = s; }}
+ />
@@ -65,4 +96,8 @@ class Header extends React.Component {
}
}
-export default Header;
+
+export default connect(
+ undefined,
+ actions
+)(Header);
diff --git a/js/components/PageOverview.js b/js/components/PageOverview.js
index baeb17d..115b9ac 100644
--- a/js/components/PageOverview.js
+++ b/js/components/PageOverview.js
@@ -18,14 +18,23 @@ const containsSearchTerm = (text = '', term = '') => {
class PageOverview extends React.Component {
- constructor(...args) {
- super(...args);
+ constructor(props, ...args) {
+ super(props, ...args);
this.state = {
ring: rings[0],
- search: '',
+ search: props.pageState.search || '',
};
}
+ componentWillReceiveProps(nextProps) {
+ if (this.search !== nextProps.pageState.search) {
+ this.setState({
+ ring: rings[0],
+ search: nextProps.pageState.search,
+ });
+ }
+ }
+
handleRingClick = (ring) => (e) => {
e.preventDefault();
diff --git a/js/components/Search.js b/js/components/Search.js
index 9c42eb2..056d240 100644
--- a/js/components/Search.js
+++ b/js/components/Search.js
@@ -1,41 +1,52 @@
import React from 'react';
import classNames from 'classnames';
-export default function Search({ value, onChange, onClose, open = false, onSubmit = () => {} }) {
- const closable = typeof onClose === 'function';
-
- const handleSubmit = (e) => {
- e.preventDefault();
- onSubmit();
- };
-
- const handleClose = (e) => {
- e.preventDefault();
- onClose();
+class Search extends React.Component {
+ focus() {
+ this.input.focus();
}
- return (
-
- );
+ render() {
+ const { value, onChange, onClose, open = false, onSubmit = () => {} } = this.props;
+
+ const closable = typeof onClose === 'function';
+
+ const handleSubmit = (e) => {
+ e.preventDefault();
+ onSubmit();
+ };
+
+ const handleClose = (e) => {
+ e.preventDefault();
+ onClose();
+ }
+
+ return (
+
+ );
+ }
}
+
+export default Search;
diff --git a/js/reducer.js b/js/reducer.js
index 31b3b7d..69c4aa5 100644
--- a/js/reducer.js
+++ b/js/reducer.js
@@ -2,6 +2,7 @@ import { NAVIGATE } from './actions';
const initialState = {
pageName: 'index',
+ pageState: {},
items: [],
releases: [],
};
@@ -12,6 +13,7 @@ const appReducer = (state = initialState, action = {}) => {
return {
...state,
pageName: action.pageName,
+ pageState: action.pageState,
}
break;
default:
diff --git a/js/server.js b/js/server.js
index 73903a9..931ac04 100644
--- a/js/server.js
+++ b/js/server.js
@@ -10,7 +10,8 @@ export const renderPage = (radar, pageName) => {
// Create a new Redux store instance
const store = createStore(appReducer, {
...radar,
- pageName
+ pageName,
+ pageState: {},
});
// Render the component to a string