Skip to main content

Exceptions catalog

HOOKSTATE-100

Happens when

  • a Hookstate State object is used in a dependency list AND
  • Hookstate is configured (via a configure function) to intercept and assert on standard Reach hooks with dependency lists only in development mode (by default, it is configured to automatically intercept always and so, this exception should not happen in the default configuration)
const state1 = useHookstate(...)
useEffect(() => {...}, [state1]) // <== Error in development mode!

To fix it, use the Hookstate provided hook functions instead:

const state1 = useHookstate(...)
useHookstateEffect(() => {...}, [state1]) // <== OK

HOOKSTATE-101

Happens when new state is created with an initial value, which is a value of another state.

const state1 = useHookstate(...)
const state2 = useHookstate(state1.value) // <== Error!

If you would like to create a state from a clone of a state, you may do something along this line:

const state1 = useHookstate(...)
const state2 = useHookstate(
// simplest way to clone an object
JSON.parse(JSON.stringify(state1.value)))

HOOKSTATE-102

Happens when state is set to a new value, which is a value of another state.

const state1 = useHookstate(...)
const state2 = useHookstate(...)
state2.set(state1.value) // <== Error!

If you would like to set state value from a clone of a state, you may do something along this line:

const state1 = useHookstate(...)
const state2 = useHookstate(...)
state2.set(
// simplest way to clone an object
JSON.parse(JSON.stringify(state1.value)))

HOOKSTATE-103

Happens when state is read (used) when its underlying promise has not been resolved or rejected yet.

const state = useHookstate(new Promise(...))
state.value // <== Error!
state.keys // <== Error!
state.map(...) // <== Error!
state.promised // <== OK
state.promise.then(...) // <== OK

More information about asynchronous states.

HOOKSTATE-104

Happens when state is written (set or merged) when its underlying promise has not been resolved or rejected yet.

const state = useHookstate(new Promise(...))
state.set(...) // <== Error!
state.merge(...) // <== Error!

More information about asynchronous states.

HOOKSTATE-105

Happens when nested state is set to a promise. Nested state does not support asynchronous state separately from a root state.

const state = useHookstate({ prop: ... })
state.prop.set(new Promise(...)) // <== Error!

More information about asynchronous states.

HOOKSTATE-106

Happens when state is set after destroy. Typically it may happen when a component is unmounted but leaves asynchronous operations running, which trigger state updates when awaited finally.

const state = hookstate(...)
destroy(state)
state.set(...) // <== Error!
const state = useHookstate(...)
React.useEffect(() => {
setTimeout(() => {
state.set(...)
}, 5000)
// <== Error is not cancelling the timeout when a component is unmounted!
})

HOOKSTATE-107

Happens when state property is read when underlying state value is a primitive value.

const state = useHookstate(1)
state.prop // <== Error!

const state = useHookstate({ child: 1 })
state.child.prop // <== Error!

HOOKSTATE-108

Happens when state is serialized to JSON.

const state = useHookstate(...)
JSON.stringify(state) // <== Error!

You likely intended to serialize state value instead:

const state = useHookstate(...)
JSON.stringify(state.value)

HOOKSTATE-109

Happens when state methods instance is serialized to JSON.

const state = useHookstate(...)
JSON.stringify(state) // <== Error!

You likely intended to serialize state value instead:

const state = useHookstate(...)
JSON.stringify(state.value)

HOOKSTATE-110

Happens when a state property of type function is being used and a parent object class is just Object.

const state = useHookstate({ callback: () => {} })
state.callback // <== Error!

If you would like to call a property of an object you should do the following instead:

const state = useHookstate({ callback: () => {} })
state.get({ noproxy: true }).callback() // <== OK

Please, note that this error happens only when an a value has Object class name. Hookstate handles correctly the cases when you call methods of instances of other classes, for example Date class.

HOOKSTATE-111

Happens when a state is attempted to be reinitialized on rerender with another store source. This is likely a mistake in a parent calling component where a new property value is passed to a child, and this property value refers to a different Hookstate State then in the previous renders.

This issue may also happen under Nextjs and Vite hot module reload (HMR), but it does not happen with react-scripts HMR. We will look in the future how to support HMR with Vite / Nextjs (see more).

HOOKSTATE-120

Deprecated in Hookstate 4.

For Hookstate 3, it happens when a plugin attempts to get its own instance from a state, where the plugin has not been attached before.

Using the Initial plugin as an example:

const state = useHookstate(...)
Initial(state) // <== Error!

Correct way:

const state = useHookstate(...)
state.attach(Initial)
Initial(state)

HOOKSTATE-201

Happens when state property is set via direct assignment.

const state = useHookstate(...)
state.prop = 'some value' // <== Error!

Correct way:

const state = useHookstate(...)
state.prop.set('some value')

HOOKSTATE-202

Happens when state value property is set via direct assignment.

const state = useHookstate(...)
state.value.prop = 'some value' // <== Error!

Correct way:

const state = useHookstate(...)
state.prop.set('some value')

HOOKSTATE-203

Setting prototype for a state is not supported.

const state = useHookstate(...)
Object.setPrototypeOf(state, ...) // <== Error!

HOOKSTATE-204

Setting prototype for a state value is not supported.

const state = useHookstate(...)
Object.setPrototypeOf(state.value, ...) // <== Error!

HOOKSTATE-205

Preventing extensions for a state is not supported.

const state = useHookstate(...)
Object.preventExtensions(state) // <== Error!

HOOKSTATE-206

Preventing extensions for a state value is not supported.

const state = useHookstate(...)
Object.preventExtensions(state.value) // <== Error!

HOOKSTATE-207

Defining new property directly on a state is not supported.

const state = useHookstate(...)
Object.defineProperty(state, 'prop', ...) // <== Error!

You likely intended the following instead:

const state = useHookstate(...)
state.prop.set(...)

HOOKSTATE-208

Defining new property directly on a state value is not supported.

const state = useHookstate(...)
Object.defineProperty(state.value, 'prop', ...) // <== Error!

You likely intended the following instead:

const state = useHookstate(...)
state.prop.set(...)

HOOKSTATE-209

Delete operator is not supported for a state object.

const state = useHookstate(...)
delete state.prop // <== Error!

You likely intended the following instead:

import { none, useHookstate } from '@hookstate/core'
const state = useHookstate(...)
state.prop.set(none)

HOOKSTATE-210

Delete operator is not supported for a state value object.

const state = useHookstate(...)
delete state[self.value].prop // <== Error!

You likely intended the following instead:

import { none, useHookstate } from '@hookstate/core'
const state = useHookstate(...)
state.prop.set(none)

HOOKSTATE-211

New operator is not supported for a state object.

const state = useHookstate(...)
new state.prop // <== Error!

HOOKSTATE-212

New operator is not supported for a state value object.

const state = useHookstate(...)
new state.value.prop // <== Error!

HOOKSTATE-213

State object is not callable.

const state = useHookstate(...)
state() // <== Error!
state.prop() // <== Error!

HOOKSTATE-214

State value object is not callable.

const state = useHookstate(...)
state.value() // <== Error!
state.value.prop() // <== Error!