import {Component} from 'preact' export interface SerializedComponent { state: S serializedSubcomponents: {[key: string]: any} } export abstract class ReloadableComponent extends Component { serialize(): SerializedComponent { const serializedSubcomponents: {[key: string]: any} = Object.create(null) const subcomponents = this.subcomponents() for (const key in subcomponents) { const val = subcomponents[key] if (val && val instanceof ReloadableComponent) { serializedSubcomponents[key] = val.serialize() } } return { state: this.state, serializedSubcomponents, } } rehydrate(serialized: SerializedComponent) { this.setState(serialized.state, () => { const subcomponents = this.subcomponents() for (const key in subcomponents) { const val = subcomponents[key] const data = serialized.serializedSubcomponents[key] if (data && val && val instanceof ReloadableComponent) { val.rehydrate(data) } } }) } subcomponents(): {[key: string]: any} { return Object.create(null) } }