import type { Dispatch, Dispatchable, Effect, Subscription, Unsubscribe, } from "hyperapp"; type LocalStorageLoaderProps = { key: string; action: Dispatchable; }; function _stateLoader( dispatch: Dispatch, props: LocalStorageLoaderProps ) { let data = localStorage.getItem(props.key); if (!data) return; data = JSON.parse(data); dispatch(props.action, data); } export function LocalStorageLoader( key: string, action: Dispatchable ): Effect { return [_stateLoader, { key, action }]; } type LocalStorageSaverProps = { key: string; value: any; }; function _stateSaver( dispatch: Dispatch, props: LocalStorageSaverProps ): Unsubscribe { requestAnimationFrame((_) => localStorage.setItem(props.key, JSON.stringify(props.value)) ); return () => {}; } export function LocalStorageSaver( key: string, value: any ): Subscription { return [_stateSaver, { key, value }]; }