Skip to content

Instantly share code, notes, and snippets.

@lexfrl
Last active September 7, 2015 12:55
Show Gist options
  • Save lexfrl/eebb41610f0d97d282ce to your computer and use it in GitHub Desktop.
Save lexfrl/eebb41610f0d97d282ce to your computer and use it in GitHub Desktop.
export default {
relocate(route) {
return {
type: "relocate",
route: route
}
}
}
import { relocate } from "./actions";
export default {
relocate (state, { route }) {
return Object.assign({}, state, { route });
}
};
import React, { PropTypes } from "react";
import router from "../../../router"
import { relocate } from "../../actions";
const Location = React.createClass({
getInitialState() {
return {
pushState: true
};
},
componentDidMount() {
if (typeof window === "undefined") {
return;
}
window.onpopstate = (e) => {
this.setState({pushState: false});
dispatch(relocate(router.match(window.location.href)));
}
},
componentWillReceiveProps(nextProps) {
if (typeof window === "undefined") {
return;
}
if (!this.shouldComponentUpdate(nextProps)) {
return;
}
if (this.state.pushState) {
window.history.pushState(null, null, router.url(nextProps.route));
}
this.setState({pushState: true});
},
shouldComponentUpdate(nextProps) {
return router.url(nextProps.route) !== router.url(this.props.route);
},
render() {
return null;
}
});
export default Location;
import React from "react";
import Link from "./components/Link"
import Loading from "./components/Loading"
import _ from "lodash";
import { isLoading } from "../common";
const Page = React.createClass({
render() {
const pages = {
"": require("./pages/Login"),
"friends": require("./pages/Friends"),
"results": require("./pages/Results")
};
const { route } = this.props.state;
let P = pages[route.name] || pages[""];
let notLoadedFields = P.getRequiredFields().filter(field => isLoading(this.props.state, field));
if (notLoadedFields.length) {
P = Loading;
};
return (
<div>
<ul>
<li>
<Link route={Object.assign({}, route, { name: "" })}>Login</Link>
<Link route={Object.assign({}, route, { name: "friends" })}>Friends</Link>
<Link route={Object.assign({}, route, { name: "results" })}>Results</Link>
</li>
</ul>
<P {...this.props} />
</div>
)
}
});
export default Page;
import Router from "routr-map";
export default new Router({
"login": {
},
"friends": {
":id": {
}
},
"results": {
":id": {
}
}
});
@lexfrl
Copy link
Author

lexfrl commented Sep 7, 2015

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment