atom.io 0.6.2 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/index.d.mts +27 -15
  2. package/dist/index.d.ts +27 -15
  3. package/dist/index.js +44 -24
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +44 -24
  6. package/dist/index.mjs.map +1 -1
  7. package/json/dist/index.d.mts +18 -0
  8. package/json/dist/index.d.ts +18 -0
  9. package/json/dist/index.js +51 -0
  10. package/json/dist/index.js.map +1 -0
  11. package/json/dist/index.mjs +15 -0
  12. package/json/dist/index.mjs.map +1 -0
  13. package/json/package.json +13 -13
  14. package/package.json +31 -12
  15. package/react/dist/index.d.mts +24 -0
  16. package/react/dist/index.d.ts +24 -0
  17. package/react/dist/index.js +87 -0
  18. package/react/dist/index.js.map +1 -0
  19. package/react/dist/index.mjs +45 -0
  20. package/react/dist/index.mjs.map +1 -0
  21. package/react/package.json +13 -13
  22. package/react-devtools/dist/index.css +26 -0
  23. package/react-devtools/dist/index.css.map +1 -0
  24. package/react-devtools/dist/index.d.mts +15 -0
  25. package/react-devtools/dist/index.d.ts +15 -0
  26. package/react-devtools/dist/index.js +2108 -0
  27. package/react-devtools/dist/index.js.map +1 -0
  28. package/react-devtools/dist/index.mjs +2080 -0
  29. package/react-devtools/dist/index.mjs.map +1 -0
  30. package/react-devtools/package.json +13 -13
  31. package/realtime/dist/index.d.mts +27 -0
  32. package/realtime/dist/index.d.ts +27 -0
  33. package/realtime/dist/index.js +191 -0
  34. package/realtime/dist/index.js.map +1 -0
  35. package/realtime/dist/index.mjs +152 -0
  36. package/realtime/dist/index.mjs.map +1 -0
  37. package/realtime/package.json +13 -13
  38. package/realtime-react/dist/index.d.mts +45 -0
  39. package/realtime-react/dist/index.d.ts +45 -0
  40. package/realtime-react/dist/index.js +217 -0
  41. package/realtime-react/dist/index.js.map +1 -0
  42. package/realtime-react/dist/index.mjs +172 -0
  43. package/realtime-react/dist/index.mjs.map +1 -0
  44. package/realtime-react/package.json +13 -13
  45. package/realtime-testing/dist/index.d.mts +49 -0
  46. package/realtime-testing/dist/index.d.ts +49 -0
  47. package/realtime-testing/dist/index.js +165 -0
  48. package/realtime-testing/dist/index.js.map +1 -0
  49. package/realtime-testing/dist/index.mjs +129 -0
  50. package/realtime-testing/dist/index.mjs.map +1 -0
  51. package/realtime-testing/package.json +15 -0
  52. package/src/atom.ts +16 -17
  53. package/src/index.ts +59 -59
  54. package/src/internal/atom-internal.ts +37 -37
  55. package/src/internal/families-internal.ts +115 -116
  56. package/src/internal/get.ts +83 -83
  57. package/src/internal/index.ts +1 -0
  58. package/src/internal/is-default.ts +17 -17
  59. package/src/internal/meta/attach-meta.ts +7 -7
  60. package/src/internal/meta/meta-state.ts +115 -115
  61. package/src/internal/operation.ts +93 -93
  62. package/src/internal/selector/create-read-write-selector.ts +47 -47
  63. package/src/internal/selector/create-readonly-selector.ts +38 -38
  64. package/src/internal/selector/lookup-selector-sources.ts +9 -9
  65. package/src/internal/selector/register-selector.ts +44 -44
  66. package/src/internal/selector/trace-selector-atoms.ts +30 -30
  67. package/src/internal/selector/update-selector-atoms.ts +25 -25
  68. package/src/internal/selector-internal.ts +38 -39
  69. package/src/internal/set.ts +78 -78
  70. package/src/internal/store.ts +119 -119
  71. package/src/internal/subject.ts +24 -0
  72. package/src/internal/subscribe-internal.ts +62 -62
  73. package/src/internal/time-travel-internal.ts +76 -76
  74. package/src/internal/timeline/add-atom-to-timeline.ts +158 -153
  75. package/src/internal/timeline-internal.ts +81 -82
  76. package/src/internal/transaction/abort-transaction.ts +8 -8
  77. package/src/internal/transaction/apply-transaction.ts +41 -41
  78. package/src/internal/transaction/build-transaction.ts +28 -28
  79. package/src/internal/transaction/index.ts +7 -7
  80. package/src/internal/transaction/redo-transaction.ts +13 -13
  81. package/src/internal/transaction/undo-transaction.ts +13 -13
  82. package/src/internal/transaction-internal.ts +49 -49
  83. package/src/json/select-json.ts +12 -12
  84. package/src/logger.ts +30 -30
  85. package/src/react/store-context.tsx +5 -6
  86. package/src/react/store-hooks.ts +19 -20
  87. package/src/react-devtools/AtomIODevtools.tsx +85 -85
  88. package/src/react-devtools/StateEditor.tsx +54 -55
  89. package/src/react-devtools/TokenList.tsx +49 -45
  90. package/src/react-explorer/AtomIOExplorer.tsx +198 -187
  91. package/src/react-explorer/explorer-effects.ts +11 -11
  92. package/src/react-explorer/explorer-states.ts +186 -193
  93. package/src/react-explorer/index.ts +11 -11
  94. package/src/react-explorer/space-states.ts +48 -50
  95. package/src/react-explorer/view-states.ts +25 -25
  96. package/src/realtime/hook-composition/expose-family.ts +81 -81
  97. package/src/realtime/hook-composition/expose-single.ts +26 -26
  98. package/src/realtime/hook-composition/expose-timeline.ts +60 -0
  99. package/src/realtime/hook-composition/index.ts +2 -2
  100. package/src/realtime/hook-composition/receive-state.ts +18 -18
  101. package/src/realtime/hook-composition/receive-transaction.ts +8 -8
  102. package/src/realtime-react/realtime-context.tsx +18 -19
  103. package/src/realtime-react/realtime-hooks.ts +17 -17
  104. package/src/realtime-react/realtime-state.ts +4 -4
  105. package/src/realtime-react/use-pull-family-member.ts +16 -17
  106. package/src/realtime-react/use-pull-family.ts +14 -15
  107. package/src/realtime-react/use-pull.ts +13 -14
  108. package/src/realtime-react/use-push.ts +16 -17
  109. package/src/realtime-react/use-server-action.ts +22 -23
  110. package/src/realtime-testing/index.ts +1 -0
  111. package/src/realtime-testing/setup-realtime-test.tsx +159 -0
  112. package/src/selector.ts +26 -27
  113. package/src/silo.ts +38 -38
  114. package/src/subscribe.ts +68 -68
  115. package/src/timeline.ts +13 -13
  116. package/src/transaction.ts +28 -28
  117. package/src/web-effects/storage.ts +17 -17
package/src/logger.ts CHANGED
@@ -5,42 +5,42 @@ import { IMPLICIT } from "./internal/store"
5
5
 
6
6
  export type Logger = Pick<Console, `error` | `info` | `warn`>
7
7
  export const LOG_LEVELS: ReadonlyArray<keyof Logger> = [
8
- `info`,
9
- `warn`,
10
- `error`,
8
+ `info`,
9
+ `warn`,
10
+ `error`,
11
11
  ] as const
12
12
 
13
13
  export const setLogLevel = (
14
- preferredLevel: `error` | `info` | `warn` | null,
15
- store: Store = IMPLICIT.STORE
14
+ preferredLevel: `error` | `info` | `warn` | null,
15
+ store: Store = IMPLICIT.STORE,
16
16
  ): void => {
17
- const { logger__INTERNAL } = store.config
18
- if (preferredLevel === null) {
19
- store.config.logger = null
20
- } else {
21
- store.config.logger = { ...console }
22
- LOG_LEVELS.forEach((logLevel) => {
23
- if (LOG_LEVELS.indexOf(logLevel) < LOG_LEVELS.indexOf(preferredLevel)) {
24
- /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
25
- store.config.logger![logLevel] = doNothing
26
- } else {
27
- /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
28
- store.config.logger![logLevel] = logger__INTERNAL[logLevel]
29
- }
30
- })
31
- }
17
+ const { logger__INTERNAL } = store.config
18
+ if (preferredLevel === null) {
19
+ store.config.logger = null
20
+ } else {
21
+ store.config.logger = { ...console }
22
+ LOG_LEVELS.forEach((logLevel) => {
23
+ if (LOG_LEVELS.indexOf(logLevel) < LOG_LEVELS.indexOf(preferredLevel)) {
24
+ // rome-ignore lint/style/noNonNullAssertion: we just set it
25
+ store.config.logger![logLevel] = doNothing
26
+ } else {
27
+ // rome-ignore lint/style/noNonNullAssertion: we just set it
28
+ store.config.logger![logLevel] = logger__INTERNAL[logLevel]
29
+ }
30
+ })
31
+ }
32
32
  }
33
33
 
34
34
  export const useLogger = (
35
- logger: Logger,
36
- store: Store = IMPLICIT.STORE
35
+ logger: Logger,
36
+ store: Store = IMPLICIT.STORE,
37
37
  ): void => {
38
- const currentLogLevel =
39
- store.config.logger === null
40
- ? null
41
- : LOG_LEVELS.find(
42
- (logLevel) => store.config.logger?.[logLevel] !== doNothing
43
- ) ?? null
44
- store.config.logger__INTERNAL = { ...logger }
45
- setLogLevel(currentLogLevel, store)
38
+ const currentLogLevel =
39
+ store.config.logger === null
40
+ ? null
41
+ : LOG_LEVELS.find(
42
+ (logLevel) => store.config.logger?.[logLevel] !== doNothing,
43
+ ) ?? null
44
+ store.config.logger__INTERNAL = { ...logger }
45
+ setLogLevel(currentLogLevel, store)
46
46
  }
@@ -1,14 +1,13 @@
1
- import * as React from "react"
2
-
3
1
  import * as AtomIO from "atom.io"
2
+ import * as React from "react"
4
3
 
5
4
  export const StoreContext = React.createContext<AtomIO.Store>(
6
- AtomIO.__INTERNAL__.IMPLICIT.STORE
5
+ AtomIO.__INTERNAL__.IMPLICIT.STORE,
7
6
  )
8
7
 
9
8
  export const StoreProvider: React.FC<{
10
- children: React.ReactNode
11
- store?: AtomIO.Store
9
+ children: React.ReactNode
10
+ store?: AtomIO.Store
12
11
  }> = ({ children, store = AtomIO.__INTERNAL__.IMPLICIT.STORE }) => (
13
- <StoreContext.Provider value={store}>{children}</StoreContext.Provider>
12
+ <StoreContext.Provider value={store}>{children}</StoreContext.Provider>
14
13
  )
@@ -1,48 +1,47 @@
1
- import * as React from "react"
2
-
3
1
  import * as AtomIO from "atom.io"
2
+ import * as React from "react"
4
3
 
5
4
  import type { Modifier } from "~/packages/anvl/src/function"
6
5
 
7
6
  import { StoreContext } from "./store-context"
8
7
 
9
8
  export type StoreHooks = {
10
- useI: <T>(token: AtomIO.StateToken<T>) => (next: Modifier<T> | T) => void
11
- useO: <T>(token: AtomIO.ReadonlySelectorToken<T> | AtomIO.StateToken<T>) => T
12
- useIO: <T>(token: AtomIO.StateToken<T>) => [T, (next: Modifier<T> | T) => void]
9
+ useI: <T>(token: AtomIO.StateToken<T>) => (next: Modifier<T> | T) => void
10
+ useO: <T>(token: AtomIO.ReadonlySelectorToken<T> | AtomIO.StateToken<T>) => T
11
+ useIO: <T>(token: AtomIO.StateToken<T>) => [T, (next: Modifier<T> | T) => void]
13
12
  }
14
13
  export const storeHooks: StoreHooks = { useI, useO, useIO }
15
14
 
16
15
  export function useI<T>(
17
- token: AtomIO.StateToken<T>
16
+ token: AtomIO.StateToken<T>,
18
17
  ): (next: Modifier<T> | T) => void {
19
- const store = React.useContext(StoreContext)
20
- const update = (next: Modifier<T> | T) => AtomIO.setState(token, next, store)
21
- return update
18
+ const store = React.useContext(StoreContext)
19
+ const update = (next: Modifier<T> | T) => AtomIO.setState(token, next, store)
20
+ return update
22
21
  }
23
22
 
24
23
  export function useO<T>(
25
- token: AtomIO.ReadonlySelectorToken<T> | AtomIO.StateToken<T>
24
+ token: AtomIO.ReadonlySelectorToken<T> | AtomIO.StateToken<T>,
26
25
  ): T {
27
- const store = React.useContext(StoreContext)
28
- return React.useSyncExternalStore<T>(
29
- (observe) => AtomIO.subscribe(token, observe, store),
30
- () => AtomIO.getState(token, store)
31
- )
26
+ const store = React.useContext(StoreContext)
27
+ return React.useSyncExternalStore<T>(
28
+ (observe) => AtomIO.subscribe(token, observe, store),
29
+ () => AtomIO.getState(token, store),
30
+ )
32
31
  }
33
32
 
34
33
  export function useIO<T>(
35
- token: AtomIO.StateToken<T>
34
+ token: AtomIO.StateToken<T>,
36
35
  ): [T, (next: Modifier<T> | T) => void] {
37
- return [useO(token), useI(token)]
36
+ return [useO(token), useI(token)]
38
37
  }
39
38
 
40
39
  export function useStore<T>(
41
- token: AtomIO.StateToken<T>
40
+ token: AtomIO.StateToken<T>,
42
41
  ): [T, (next: Modifier<T> | T) => void]
43
42
  export function useStore<T>(token: AtomIO.ReadonlySelectorToken<T>): T
44
43
  export function useStore<T>(
45
- token: AtomIO.ReadonlySelectorToken<T> | AtomIO.StateToken<T>
44
+ token: AtomIO.ReadonlySelectorToken<T> | AtomIO.StateToken<T>,
46
45
  ): T | [T, (next: Modifier<T> | T) => void] {
47
- return token.type === `readonly_selector` ? useO(token) : useIO(token)
46
+ return token.type === `readonly_selector` ? useO(token) : useIO(token)
48
47
  }
@@ -1,10 +1,9 @@
1
- import type { FC } from "react"
2
- import { useRef } from "react"
3
-
4
1
  import { atom, __INTERNAL__ } from "atom.io"
5
2
  import type { StoreHooks } from "atom.io/react"
6
3
  import { useI, useO, useIO } from "atom.io/react"
7
4
  import { LayoutGroup, motion, spring } from "framer-motion"
5
+ import { useRef } from "react"
6
+ import type { FC } from "react"
8
7
 
9
8
  import { TokenList } from "./TokenList"
10
9
  import { lazyLocalStorageEffect } from "../web-effects"
@@ -12,96 +11,97 @@ import { lazyLocalStorageEffect } from "../web-effects"
12
11
  import "./devtools.scss"
13
12
 
14
13
  const { atomTokenIndexState, selectorTokenIndexState } =
15
- __INTERNAL__.META.attachMetaState()
14
+ __INTERNAL__.META.attachMetaState()
16
15
 
17
16
  const devtoolsAreOpenState = atom<boolean>({
18
- key: `👁‍🗨_devtools_are_open`,
19
- default: true,
20
- effects: [lazyLocalStorageEffect(`👁‍🗨_devtools_are_open`)],
17
+ key: `👁‍🗨_devtools_are_open`,
18
+ default: true,
19
+ effects: [lazyLocalStorageEffect(`👁‍🗨_devtools_are_open`)],
21
20
  })
22
21
 
23
22
  export const composeDevtools = (storeHooks: StoreHooks): FC => {
24
- const Devtools: FC = () => {
25
- const constraintsRef = useRef(null)
23
+ const Devtools: FC = () => {
24
+ const constraintsRef = useRef(null)
26
25
 
27
- const [devtoolsAreOpen, setDevtoolsAreOpen] =
28
- storeHooks.useIO(devtoolsAreOpenState)
26
+ const [devtoolsAreOpen, setDevtoolsAreOpen] =
27
+ storeHooks.useIO(devtoolsAreOpenState)
29
28
 
30
- const mouseHasMoved = useRef(false)
29
+ const mouseHasMoved = useRef(false)
31
30
 
32
- return (
33
- <>
34
- <motion.span
35
- ref={constraintsRef}
36
- className="atom_io_devtools_zone"
37
- style={{
38
- position: `fixed`,
39
- top: 0,
40
- left: 0,
41
- right: 0,
42
- bottom: 0,
43
- pointerEvents: `none`,
44
- }}
45
- />
46
- <motion.main
47
- drag
48
- dragConstraints={constraintsRef}
49
- className="atom_io_devtools"
50
- transition={spring}
51
- style={
52
- devtoolsAreOpen
53
- ? {}
54
- : {
55
- backgroundColor: `#0000`,
56
- borderColor: `#0000`,
57
- maxHeight: 28,
58
- maxWidth: 33,
59
- }
60
- }
61
- >
62
- {devtoolsAreOpen ? (
63
- <>
64
- <motion.header>
65
- <h1>atom.io</h1>
66
- </motion.header>
67
- <motion.main>
68
- <LayoutGroup>
69
- <section>
70
- <h2>atoms</h2>
71
- <TokenList
72
- storeHooks={storeHooks}
73
- tokenIndex={atomTokenIndexState}
74
- />
75
- </section>
76
- <section>
77
- <h2>selectors</h2>
78
- <TokenList
79
- storeHooks={storeHooks}
80
- tokenIndex={selectorTokenIndexState}
81
- />
82
- </section>
83
- </LayoutGroup>
84
- </motion.main>
85
- </>
86
- ) : null}
87
- <footer>
88
- <button
89
- onMouseDown={() => (mouseHasMoved.current = false)}
90
- onMouseMove={() => (mouseHasMoved.current = true)}
91
- onMouseUp={() => {
92
- if (!mouseHasMoved.current) {
93
- setDevtoolsAreOpen((open) => !open)
94
- }
95
- }}
96
- >
97
- 👁‍🗨
98
- </button>
99
- </footer>
100
- </motion.main>
101
- </>
102
- )
103
- }
104
- return Devtools
31
+ return (
32
+ <>
33
+ <motion.span
34
+ ref={constraintsRef}
35
+ className="atom_io_devtools_zone"
36
+ style={{
37
+ position: `fixed`,
38
+ top: 0,
39
+ left: 0,
40
+ right: 0,
41
+ bottom: 0,
42
+ pointerEvents: `none`,
43
+ }}
44
+ />
45
+ <motion.main
46
+ drag
47
+ dragConstraints={constraintsRef}
48
+ className="atom_io_devtools"
49
+ transition={spring}
50
+ style={
51
+ devtoolsAreOpen
52
+ ? {}
53
+ : {
54
+ backgroundColor: `#0000`,
55
+ borderColor: `#0000`,
56
+ maxHeight: 28,
57
+ maxWidth: 33,
58
+ }
59
+ }
60
+ >
61
+ {devtoolsAreOpen ? (
62
+ <>
63
+ <motion.header>
64
+ <h1>atom.io</h1>
65
+ </motion.header>
66
+ <motion.main>
67
+ <LayoutGroup>
68
+ <section>
69
+ <h2>atoms</h2>
70
+ <TokenList
71
+ storeHooks={storeHooks}
72
+ tokenIndex={atomTokenIndexState}
73
+ />
74
+ </section>
75
+ <section>
76
+ <h2>selectors</h2>
77
+ <TokenList
78
+ storeHooks={storeHooks}
79
+ tokenIndex={selectorTokenIndexState}
80
+ />
81
+ </section>
82
+ </LayoutGroup>
83
+ </motion.main>
84
+ </>
85
+ ) : null}
86
+ <footer>
87
+ <button
88
+ type="button"
89
+ onMouseDown={() => (mouseHasMoved.current = false)}
90
+ onMouseMove={() => (mouseHasMoved.current = true)}
91
+ onMouseUp={() => {
92
+ if (!mouseHasMoved.current) {
93
+ setDevtoolsAreOpen((open) => !open)
94
+ }
95
+ }}
96
+ >
97
+ 👁‍🗨
98
+ </button>
99
+ </footer>
100
+ </motion.main>
101
+ </>
102
+ )
103
+ }
104
+ return Devtools
105
105
  }
106
106
 
107
107
  export const AtomIODevtools = composeDevtools({ useI, useO, useIO })
@@ -1,73 +1,72 @@
1
- import type { FC } from "react"
2
-
3
1
  import type { ReadonlySelectorToken, StateToken } from "atom.io"
4
2
  import type { StoreHooks } from "atom.io/react"
3
+ import type { FC } from "react"
5
4
 
6
5
  import { isPlainJson } from "~/packages/anvl/src/json"
7
6
  import { ElasticInput } from "~/packages/hamr/src/react-elastic-input"
8
7
  import { JsonEditor } from "~/packages/hamr/src/react-json-editor"
9
8
 
10
9
  export const StateEditor: FC<{
11
- storeHooks: StoreHooks
12
- token: StateToken<unknown>
10
+ storeHooks: StoreHooks
11
+ token: StateToken<unknown>
13
12
  }> = ({ storeHooks, token }) => {
14
- const [data, set] = storeHooks.useIO(token)
15
- return isPlainJson(data) ? (
16
- <JsonEditor data={data} set={set} schema={true} />
17
- ) : (
18
- <div className="json_editor">
19
- <ElasticInput
20
- value={
21
- data instanceof Set
22
- ? `Set { ${JSON.stringify([...data]).slice(1, -1)} }`
23
- : data instanceof Map
24
- ? `Map ` + JSON.stringify([...data])
25
- : Object.getPrototypeOf(data).constructor.name +
26
- ` ` +
27
- JSON.stringify(data)
28
- }
29
- disabled={true}
30
- />
31
- </div>
32
- )
13
+ const [data, set] = storeHooks.useIO(token)
14
+ return isPlainJson(data) ? (
15
+ <JsonEditor data={data} set={set} schema={true} />
16
+ ) : (
17
+ <div className="json_editor">
18
+ <ElasticInput
19
+ value={
20
+ data instanceof Set
21
+ ? `Set { ${JSON.stringify([...data]).slice(1, -1)} }`
22
+ : data instanceof Map
23
+ ? `Map ` + JSON.stringify([...data])
24
+ : Object.getPrototypeOf(data).constructor.name +
25
+ ` ` +
26
+ JSON.stringify(data)
27
+ }
28
+ disabled={true}
29
+ />
30
+ </div>
31
+ )
33
32
  }
34
33
 
35
34
  export const ReadonlySelectorEditor: FC<{
36
- storeHooks: StoreHooks
37
- token: ReadonlySelectorToken<unknown>
35
+ storeHooks: StoreHooks
36
+ token: ReadonlySelectorToken<unknown>
38
37
  }> = ({ storeHooks, token }) => {
39
- const data = storeHooks.useO(token)
40
- return isPlainJson(data) ? (
41
- <JsonEditor
42
- data={data}
43
- set={() => null}
44
- schema={true}
45
- isReadonly={() => true}
46
- />
47
- ) : (
48
- <div className="json_editor">
49
- <ElasticInput
50
- value={
51
- data instanceof Set
52
- ? `Set ` + JSON.stringify([...data])
53
- : data instanceof Map
54
- ? `Map ` + JSON.stringify([...data])
55
- : Object.getPrototypeOf(data).constructor.name +
56
- ` ` +
57
- JSON.stringify(data)
58
- }
59
- disabled={true}
60
- />
61
- </div>
62
- )
38
+ const data = storeHooks.useO(token)
39
+ return isPlainJson(data) ? (
40
+ <JsonEditor
41
+ data={data}
42
+ set={() => null}
43
+ schema={true}
44
+ isReadonly={() => true}
45
+ />
46
+ ) : (
47
+ <div className="json_editor">
48
+ <ElasticInput
49
+ value={
50
+ data instanceof Set
51
+ ? `Set ` + JSON.stringify([...data])
52
+ : data instanceof Map
53
+ ? `Map ` + JSON.stringify([...data])
54
+ : Object.getPrototypeOf(data).constructor.name +
55
+ ` ` +
56
+ JSON.stringify(data)
57
+ }
58
+ disabled={true}
59
+ />
60
+ </div>
61
+ )
63
62
  }
64
63
 
65
64
  export const StoreEditor: FC<{
66
- storeHooks: StoreHooks
67
- token: ReadonlySelectorToken<unknown> | StateToken<unknown>
65
+ storeHooks: StoreHooks
66
+ token: ReadonlySelectorToken<unknown> | StateToken<unknown>
68
67
  }> = ({ storeHooks, token }) => {
69
- if (token.type === `readonly_selector`) {
70
- return <ReadonlySelectorEditor storeHooks={storeHooks} token={token} />
71
- }
72
- return <StateEditor storeHooks={storeHooks} token={token} />
68
+ if (token.type === `readonly_selector`) {
69
+ return <ReadonlySelectorEditor storeHooks={storeHooks} token={token} />
70
+ }
71
+ return <StateEditor storeHooks={storeHooks} token={token} />
73
72
  }
@@ -1,57 +1,61 @@
1
- import type { FC } from "react"
2
- import { Fragment } from "react"
3
-
4
1
  import type {
5
- AtomToken,
6
- ReadonlySelectorToken,
7
- SelectorToken,
8
- __INTERNAL__,
2
+ AtomToken,
3
+ ReadonlySelectorToken,
4
+ SelectorToken,
5
+ __INTERNAL__,
9
6
  } from "atom.io"
10
7
  import { getState } from "atom.io"
11
8
  import type { StoreHooks } from "atom.io/react"
9
+ import { Fragment } from "react"
10
+ import type { FC } from "react"
12
11
 
13
12
  import { recordToEntries } from "~/packages/anvl/src/object"
14
13
 
15
14
  import { StoreEditor } from "./StateEditor"
16
15
 
17
16
  export const TokenList: FC<{
18
- storeHooks: StoreHooks
19
- tokenIndex: ReadonlySelectorToken<
20
- __INTERNAL__.META.StateTokenIndex<
21
- | AtomToken<unknown>
22
- | ReadonlySelectorToken<unknown>
23
- | SelectorToken<unknown>
24
- >
25
- >
17
+ storeHooks: StoreHooks
18
+ tokenIndex: ReadonlySelectorToken<
19
+ __INTERNAL__.META.StateTokenIndex<
20
+ | AtomToken<unknown>
21
+ | ReadonlySelectorToken<unknown>
22
+ | SelectorToken<unknown>
23
+ >
24
+ >
26
25
  }> = ({ storeHooks, tokenIndex }) => {
27
- const tokenIds = storeHooks.useO(tokenIndex)
28
- return (
29
- <>
30
- {Object.entries(tokenIds).map(([key, token]) => (
31
- <Fragment key={key}>
32
- {key.startsWith(`👁‍🗨_`) ? null : (
33
- <div className="node">
34
- {`type` in token ? (
35
- <>
36
- <label onClick={() => console.log(token, getState(token))}>
37
- {key}
38
- </label>
39
- <StoreEditor storeHooks={storeHooks} token={token} />
40
- </>
41
- ) : (
42
- recordToEntries(token.familyMembers).map(([key, token]) => (
43
- <>
44
- <label>{key}</label>
45
- <div key={key} className="node">
46
- {key}:<StoreEditor storeHooks={storeHooks} token={token} />
47
- </div>
48
- </>
49
- ))
50
- )}
51
- </div>
52
- )}
53
- </Fragment>
54
- ))}
55
- </>
56
- )
26
+ const tokenIds = storeHooks.useO(tokenIndex)
27
+ return (
28
+ <>
29
+ {Object.entries(tokenIds).map(([key, token]) => {
30
+ let logState: () => void
31
+ return (
32
+ <Fragment key={key}>
33
+ {key.startsWith(`👁‍🗨_`) ? null : (
34
+ <div className="node">
35
+ {`type` in token
36
+ ? ((logState = () => console.log(token, getState(token))),
37
+ (
38
+ <>
39
+ <label onClick={logState} onKeyUp={logState}>
40
+ {key}
41
+ </label>
42
+ <StoreEditor storeHooks={storeHooks} token={token} />
43
+ </>
44
+ ))
45
+ : recordToEntries(token.familyMembers).map(([key, token]) => (
46
+ <>
47
+ <label>{key}</label>
48
+ <div key={key} className="node">
49
+ {key}:
50
+ <StoreEditor storeHooks={storeHooks} token={token} />
51
+ </div>
52
+ </>
53
+ ))}
54
+ </div>
55
+ )}
56
+ </Fragment>
57
+ )
58
+ })}
59
+ </>
60
+ )
57
61
  }