11'use strict' ;
22
3- import React , { useState } from 'react' ;
3+ import { useState } from 'react' ;
4+
5+ function useObjectState ( initObject ) {
6+ if ( ! isFilledObject ( initObject ) ) {
7+ console . warn ( 'A non-empty object must be provided to useObjectState. State not created.' ) ;
8+ return [ ] ;
9+ }
410
5- function useObjectState ( initObject = { } ) {
611 const [ state , setState ] = useState ( initObject ) ;
712
813 const updateObject = ( partialState ) => {
9- let partial = partialState ;
10-
11- if ( typeof partial === 'function' ) {
12- partial = partialState ( state ) ;
14+ if ( typeof partialState === 'function' ) {
15+ partialState = partialState ( state ) ;
1316 }
1417
15- if (
16- ! partial ||
17- typeof partial !== 'object' ||
18- Object . keys ( partial ) . length === 0
19- ) {
20- console . error ( 'Object or function returning object must be passed to useObjectState setter. State not updated.' ) ;
18+ if ( ! isFilledObject ( partialState ) ) {
19+ console . warn ( 'An object or function returning an object must be passed to useObjectState setter. State not updated.' ) ;
2120 return ;
2221 }
2322
2423 let stateCopy = Object . assign ( { } , state ) ;
25- let stateKeys = Object . keys ( stateCopy ) ;
24+ const stateKeys = Object . keys ( stateCopy ) ;
2625
27- for ( let [ key , val ] of Object . entries ( partial ) ) {
28- if ( stateKeys . includes ( key ) ) {
29- if ( typeof stateCopy [ key ] === 'object' ) {
30- Object . assign ( stateCopy [ key ] , val ) ;
26+ for ( const [ partialKey , partialVal ] of Object . entries ( partialState ) ) {
27+ if ( stateKeys . includes ( partialKey ) ) {
28+ if ( typeof stateCopy [ partialKey ] === 'object' ) {
29+ Object . assign ( stateCopy [ partialKey ] , partialVal ) ;
3130 } else {
32- stateCopy [ key ] = val ;
31+ stateCopy [ partialKey ] = partialVal ;
3332 }
3433 }
3534 }
3635
3736 setState ( stateCopy ) ;
38- }
37+ } ;
3938
40- // Provide initial/changed object and function to component
4139 return [ state , updateObject ] ;
4240}
4341
44- export default useObjectState ;
42+ function isFilledObject ( obj ) {
43+ if (
44+ ! obj ||
45+ typeof obj !== 'object' ||
46+ Object . keys ( obj ) . length === 0
47+ ) {
48+ return false ;
49+ }
50+
51+ return true ;
52+ }
53+
54+ export default useObjectState ;
55+ export {
56+ isFilledObject
57+ } ;
0 commit comments