~repos /edge-city

#react#js#ssr

git clone https://pyrossh.dev/repos/edge-city.git

edge-city is a next level meta-framework for react that runs only on edge runtimes


bf78f572 Peter John

2 years ago
move atom to separate file
Files changed (3) hide show
  1. atom.js +47 -0
  2. index.js +1 -0
  3. router.js +1 -47
atom.js ADDED
@@ -0,0 +1,47 @@
1
+ import { useState, useEffect } from 'react';
2
+
3
+ export const atom = (initial) => {
4
+ let value;
5
+ const isDerived = typeof initial === 'function';
6
+ const subs = new Set();
7
+ const get = (a) => {
8
+ a.subscribe(compute);
9
+ return a.getValue();
10
+ };
11
+ const compute = () => {
12
+ value = initial(get);
13
+ subs.forEach((sub) => {
14
+ sub(value);
15
+ });
16
+ };
17
+ if (isDerived) {
18
+ compute();
19
+ } else {
20
+ value = initial;
21
+ }
22
+ return {
23
+ getValue() {
24
+ return value;
25
+ },
26
+ subscribe(fn) {
27
+ subs.add(fn);
28
+ return () => subs.delete(fn);
29
+ },
30
+ update(fn) {
31
+ value = fn(value);
32
+ subs.forEach((sub) => {
33
+ sub(value);
34
+ });
35
+ },
36
+ };
37
+ };
38
+
39
+ export const useAtom = (atom) => {
40
+ const [data, setData] = useState(atom.getValue());
41
+ useEffect(() => {
42
+ return atom.subscribe((value) => {
43
+ setData(value);
44
+ });
45
+ }, []);
46
+ return data;
47
+ };
index.js CHANGED
@@ -45,6 +45,7 @@ const renderPage = async (filePath, url, params) => {
45
45
  ...deps,
46
46
  "react-dom/client": "https://esm.sh/react-dom@18.2.0/client?dev",
47
47
  "react/jsx-dev-runtime": "https://esm.sh/react@18.2.0/jsx-dev-runtime?dev",
48
+ "@/atom.js": "/assets/js/src/atom.js",
48
49
  "@/router.js": "/assets/js/src/router.js",
49
50
  "@/routes/index/page.jsx": "/routes/index/page.js",
50
51
  "@/components/Todo.jsx": "/components/Todo.js",
router.js CHANGED
@@ -1,50 +1,4 @@
1
- import { useState, useEffect } from 'react';
1
+ import { atom, useAtom } from "@/atom.js";
2
-
3
- export const atom = (initial) => {
4
- let value;
5
- const isDerived = typeof initial === 'function';
6
- const subs = new Set();
7
- const get = (a) => {
8
- a.subscribe(compute);
9
- return a.getValue();
10
- };
11
- const compute = () => {
12
- value = initial(get);
13
- subs.forEach((sub) => {
14
- sub(value);
15
- });
16
- };
17
- if (isDerived) {
18
- compute();
19
- } else {
20
- value = initial;
21
- }
22
- return {
23
- getValue() {
24
- return value;
25
- },
26
- subscribe(fn) {
27
- subs.add(fn);
28
- return () => subs.delete(fn);
29
- },
30
- update(fn) {
31
- value = fn(value);
32
- subs.forEach((sub) => {
33
- sub(value);
34
- });
35
- },
36
- };
37
- };
38
-
39
- export const useAtom = (atom) => {
40
- const [data, setData] = useState(atom.getValue());
41
- useEffect(() => {
42
- return atom.subscribe((value) => {
43
- setData(value);
44
- });
45
- }, []);
46
- return data;
47
- };
48
2
 
49
3
  export const routerAtom = atom({
50
4
  pathname: "/",