import React from 'react'; import { createSubscriptionContainer, SubscriptioHookOptions } from './substated'; import { useRenderCount } from './useRenderCount'; import { useForceRender } from './useForceRender'; export default { title: 'hooks/substated', }; function useCounter({ setState, getState, updateState, subscribe, }: SubscriptioHookOptions<{ count: number; extra?: number }>) { console.log(`Call useCounter`, getState()); const decrement = () => updateState((s) => s.count--); const increment = () => updateState((s) => s.count++); const onExtraChange = () => updateState((s) => (s.extra = Math.random())); subscribe((v) => { if (v.count === 5) { updateState((s) => (s.count = 0)); } }); subscribe((v) => { console.log(`State`, v); }); return { decrement, increment, onExtraChange }; } const Counter = createSubscriptionContainer(useCounter); function CounterValue() { const count = Counter.useSelector((v) => v.count); const rc = useRenderCount(); return ( {count} - Render: {rc} ); } function CounterDisplay() { const counter = Counter.useContainer(); const rc = useRenderCount(); return (
Render:{rc}
); } function Actions() { const { onExtraChange } = Counter.useContainer(); const extra = Counter.useSelector((v) => v.extra); return ; } export const CounterDemo = () => { const forceUpdate = useForceRender(); return (
); };