history persistor: follow the recommended HOC guidelines.

master
Tom Hacohen 7 years ago
parent 5a1b3af9b0
commit 331d85d3a2

@ -36,7 +36,7 @@ class JournalCalendar extends React.PureComponent {
} }
render() { render() {
const PersistCalendar = historyPersistor(Calendar, 'Calendar'); const PersistCalendar = historyPersistor('Calendar')(Calendar);
let items = this.props.entries; let items = this.props.entries;
return ( return (

@ -77,7 +77,7 @@ class PimMain extends React.PureComponent {
} as any, } as any,
}; };
const PersistCalendar = historyPersistor(Calendar, 'Calendar'); const PersistCalendar = historyPersistor('Calendar')(Calendar);
return ( return (
<React.Fragment> <React.Fragment>
@ -114,4 +114,4 @@ class PimMain extends React.PureComponent {
} }
} }
export default historyPersistor(PimMain, 'PimMain'); export default historyPersistor('PimMain')(PimMain);

@ -6,26 +6,28 @@ let stateCache = {};
type Constructor<T> = new(...args: any[]) => T; type Constructor<T> = new(...args: any[]) => T;
export function historyPersistor<T extends Constructor<React.Component>>(Base: T, tag: string) { export function historyPersistor(tag: string) {
return withRouter(class extends Base { return function<T extends Constructor<React.Component>>(Base: T) {
constructor(...rest: any[]) { return withRouter(class extends Base {
const props = rest[0]; constructor(...rest: any[]) {
super(...rest); const props = rest[0];
const tagName = this.getKeyForTag(props, tag); super(...rest);
if (tagName in stateCache) { const tagName = this.getKeyForTag(props, tag);
this.state = stateCache[tagName]; if (tagName in stateCache) {
this.state = stateCache[tagName];
}
} }
}
componentWillUnmount() { componentWillUnmount() {
if (super.componentWillUnmount) { if (super.componentWillUnmount) {
super.componentWillUnmount(); super.componentWillUnmount();
}
stateCache[this.getKeyForTag(this.props, tag)] = this.state;
} }
stateCache[this.getKeyForTag(this.props, tag)] = this.state;
}
getKeyForTag(props: any, tagName: string) { getKeyForTag(props: any, tagName: string) {
return props.location.pathname + ':' + tagName; return props.location.pathname + ':' + tagName;
} }
}); });
};
} }

Loading…
Cancel
Save