@@ -3,7 +3,7 @@ import { isEmpty } from "lodash";
3
3
import { simpleMultiComp , stateComp , withViewFn } from "../generators" ;
4
4
import { NameConfig , withExposingConfigs } from "../generators/withExposing" ;
5
5
import { JSONObject } from "../../util/jsonTypes" ;
6
- import { useEffect } from "react" ;
6
+ import { useEffect , useMemo , useCallback } from "react" ;
7
7
import isEqual from "fast-deep-equal" ;
8
8
import { trans } from "i18n" ;
9
9
import log from "loglevel" ;
@@ -13,28 +13,36 @@ const APP_STORE_NAMESPACE = "lowcoder_app_local_storage";
13
13
const LocalStorageCompBase = withViewFn (
14
14
simpleMultiComp ( { values : stateComp < JSONObject > ( { } ) } ) ,
15
15
( comp ) => {
16
- // add custom event listener to update values reactively
17
- useEffect ( ( ) => {
18
- const handler = ( ) => {
19
- try {
20
- const raw = localStorage . getItem ( APP_STORE_NAMESPACE ) || "{}" ;
21
- const parsed = JSON . parse ( raw ) ;
22
- comp . children . values . dispatchChangeValueAction ( parsed ) ;
23
- } catch ( e ) {
24
- log . error ( "Failed to parse localStorage:" , e ) ;
25
- }
26
- } ;
16
+ const originStore = localStorage . getItem ( APP_STORE_NAMESPACE ) || "{}" ;
17
+
18
+ const parseStore = useMemo ( ( ) => {
19
+ try {
20
+ return JSON . parse ( originStore ) ;
21
+ } catch ( e ) {
22
+ log . error ( "application local storage invalid" ) ;
23
+ return { } ;
24
+ }
25
+ } , [ originStore ] ) ;
26
+
27
+ const handleStorageUpdate = useCallback ( ( ) => {
28
+ try {
29
+ comp . children . values . dispatchChangeValueAction ( parseStore ) ;
30
+ } catch ( e ) {
31
+ log . error ( "Failed to parse localStorage:" , e ) ;
32
+ }
33
+ } , [ parseStore , comp . children . values ] ) ;
27
34
35
+ useEffect ( ( ) => {
28
36
// Add listener on mount
29
- window . addEventListener ( "lowcoder-localstorage-updated" , handler ) ;
37
+ window . addEventListener ( "lowcoder-localstorage-updated" , handleStorageUpdate ) ;
30
38
31
39
// Run once on mount to initialize
32
- handler ( ) ;
40
+ handleStorageUpdate ( ) ;
33
41
34
42
return ( ) => {
35
- window . removeEventListener ( "lowcoder-localstorage-updated" , handler ) ;
43
+ window . removeEventListener ( "lowcoder-localstorage-updated" , handleStorageUpdate ) ;
36
44
} ;
37
- } , [ ] ) ;
45
+ } , [ handleStorageUpdate ] ) ;
38
46
39
47
return null ;
40
48
}
0 commit comments