You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
etesync/src/persist-state-history.tsx

34 lines
998 B
TypeScript

import * as React from 'react';
import { withRouter } from 'react-router';
// FIXME: Should probably tie this to the history object, or at least based on the depth of the history
const stateCache = {};
type Constructor<T> = new(...args: any[]) => T;
export function historyPersistor(tag: string) {
return <T extends Constructor<React.Component>>(Base: T) => {
return withRouter(class extends Base {
constructor(...rest: any[]) {
const props = rest[0];
super(...rest);
const tagName = this.getKeyForTag(props, tag);
if (tagName in stateCache) {
this.state = stateCache[tagName];
}
}
public componentWillUnmount() {
if (super.componentWillUnmount) {
super.componentWillUnmount();
}
stateCache[this.getKeyForTag(this.props, tag)] = this.state;
}
public getKeyForTag(props: any, tagName: string) {
return props.location.pathname + ':' + tagName;
}
});
};
}