File tree Expand file tree Collapse file tree 4 files changed +100
-5
lines changed
Expand file tree Collapse file tree 4 files changed +100
-5
lines changed Original file line number Diff line number Diff line change 2121 "author" : " alevnyacow" ,
2222 "license" : " MIT" ,
2323 "devDependencies" : {
24- "@testing-library/react" : " ^12.1.3" ,
2524 "@types/jest" : " ^27.4.1" ,
2625 "@types/react" : " ^17.0.39" ,
26+ "@types/uuid" : " ^8.3.4" ,
2727 "@typescript-eslint/eslint-plugin" : " ^5.14.0" ,
2828 "@typescript-eslint/parser" : " ^5.14.0" ,
2929 "del-cli" : " ^4.0.1" ,
3030 "eslint" : " ^8.10.0" ,
3131 "jest" : " ^27.5.1" ,
3232 "prettier" : " ^2.5.1" ,
33- "react" : " ^17.0.2" ,
3433 "ts-jest" : " ^27.1.3" ,
3534 "typescript" : " ^4.6.2"
3635 },
36+ "peerDependencies" : {
37+ "react" : " ^16.8.0"
38+ },
3739 "types" : " transpiled/index.d.ts" ,
3840 "dependencies" : {
39- "@alevnyacow/deep-js-proxy" : " ^0.0.1"
41+ "@alevnyacow/deep-js-proxy" : " ^1.0.0" ,
42+ "uuid" : " ^8.3.2"
4043 },
4144 "repository" : {
4245 "type" : " git" ,
Original file line number Diff line number Diff line change 1- const answerForEverything = 42 ;
1+ import { useCallback , useEffect , useRef } from "react" ;
2+ import { v4 } from "uuid" ;
3+ import { deepProxy } from "@alevnyacow/deep-js-proxy" ;
4+ import { useRerenderer } from "./use-rerenderer" ;
5+ import { rerenderersList } from "./rerenderers-list" ;
26
3- export { answerForEverything } ;
7+ function createUseSharedVariable < T extends object > ( initialState : T ) {
8+ const variableIdentifier = v4 ( ) ;
9+ const sharedVariable = deepProxy (
10+ [ rerenderersList . fire ] ,
11+ variableIdentifier
12+ ) ( initialState ) ;
13+
14+ function useSharedVariable ( rerenderOnChange = true ) {
15+ useEffect ( ( ) => {
16+ const rerenderer = useRerenderer ( ) ;
17+ const memoizedRerenderer = useCallback ( rerenderer , [ ] ) ;
18+ const rerenderIdentifier = useRef ( v4 ( ) ) ;
19+ rerenderersList . add (
20+ variableIdentifier ,
21+ rerenderIdentifier . current ,
22+ rerenderOnChange ? memoizedRerenderer : ( ) => { }
23+ ) ;
24+ return ( ) => {
25+ rerenderersList . remove (
26+ variableIdentifier ,
27+ rerenderIdentifier . current
28+ ) ;
29+ } ;
30+ } , [ ] ) ;
31+
32+ return sharedVariable ;
33+ }
34+
35+ return useSharedVariable ;
36+ }
37+
38+ export { createUseSharedVariable } ;
Original file line number Diff line number Diff line change 1+ class RerenderersList {
2+ private _rerenderersData : Record < string , Record < string , ( ) => void > > ;
3+
4+ constructor ( ) {
5+ this . _rerenderersData = { } ;
6+ }
7+
8+ private addForVariable = ( variableId : string ) => {
9+ this . _rerenderersData [ variableId ] = { } ;
10+ } ;
11+
12+ private existsForVariable = ( variableId : string ) => {
13+ return this . _rerenderersData [ variableId ] !== undefined ;
14+ } ;
15+
16+ public add = (
17+ variableId : string ,
18+ rerendererId : string ,
19+ rerenderer : ( ) => void
20+ ) => {
21+ if ( ! this . existsForVariable ( variableId ) ) {
22+ this . addForVariable ( variableId ) ;
23+ }
24+
25+ this . _rerenderersData [ variableId ] [ rerendererId ] = rerenderer ;
26+ } ;
27+
28+ public remove = ( variableId : string , rerendererId : string ) => {
29+ const variableRerendersData = this . _rerenderersData [ variableId ] ;
30+
31+ if ( ! variableRerendersData ) {
32+ return ;
33+ }
34+
35+ delete variableRerendersData [ rerendererId ] ;
36+ } ;
37+
38+ public fire = ( variableId : string ) => {
39+ if ( ! this . existsForVariable ( variableId ) ) {
40+ return ;
41+ }
42+
43+ Object . values ( this . _rerenderersData [ variableId ] ) . forEach ( ( rerender ) => {
44+ rerender ( ) ;
45+ } ) ;
46+ } ;
47+ }
48+
49+ const rerenderersList = new RerenderersList ( ) ;
50+
51+ export { rerenderersList } ;
Original file line number Diff line number Diff line change 1+ import { useState } from "react" ;
2+
3+ export function useRerenderer ( ) {
4+ const [ , setNewDummyObject ] = useState ( { } ) ;
5+ return ( ) => setNewDummyObject ( { } ) ;
6+ }
You can’t perform that action at this time.
0 commit comments