Skip to content

Commit c47ded2

Browse files
committed
v 0.0.1
1 parent a7caee2 commit c47ded2

File tree

4 files changed

+100
-5
lines changed

4 files changed

+100
-5
lines changed

package.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,25 @@
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",

sources/index.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,38 @@
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 };

sources/rerenderers-list.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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 };

sources/use-rerenderer.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { useState } from "react";
2+
3+
export function useRerenderer() {
4+
const [, setNewDummyObject] = useState({});
5+
return () => setNewDummyObject({});
6+
}

0 commit comments

Comments
 (0)