Skip to content

Commit 4be661c

Browse files
committed
feat: react integration
1 parent ab8d23d commit 4be661c

File tree

11 files changed

+310
-53
lines changed

11 files changed

+310
-53
lines changed

package.json

+3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
},
2121
"devDependencies": {
2222
"@release-it/conventional-changelog": "^3.2.0",
23+
"@testing-library/jest-dom": "^5.14.1",
24+
"@testing-library/react": "^12.0.0",
25+
"@types/react": "^17.0.19",
2326
"react": "^17.0.2",
2427
"react-dom": "^17.0.2",
2528
"release-it": "^14.11.5",

packages/dotto.x/computed/take.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { ReadableStore } from './computed'
44
import { DotXStore } from '../create-store'
55
import { ResolveType } from '../utils/get'
66

7-
export function take<Sub extends ReadableStore>(dep: Sub): ReturnType<Sub.get>
7+
export function take<Sub extends ReadableStore>(dep: Sub): ReturnType<Sub['get']>
88

99
export function take<Data, Query extends string>(
1010
dep: DotXStore<Data>,

packages/fetch/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
"author": "Eddort <[email protected]>",
88
"license": "MIT",
99
"sideEffects": false,
10-
"private": false,
1110
"type": "module",
1211
"types": "./index.d.ts",
1312
"scripts": {

packages/react/index.d.ts

+17-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,17 @@
1-
export { useSelector } from './useSelector'
1+
import { DotXStore, ResolveType, ReadableStore, BindedStore } from 'dotto.x'
2+
3+
export function useStore<Data extends any>(store: DotXStore<Data>): Data
4+
export function useStore<Store extends ReadableStore>(
5+
store: Store
6+
): ReturnType<Store['get']>
7+
8+
export function useStore<Store extends BindedStore>(
9+
store: Store
10+
): ReturnType<Store['get']>
11+
12+
export function useStore<Data, Selector extends string>(
13+
store: DotXStore<Data>,
14+
selector: Selector
15+
): ResolveType<Data, Selector>
16+
17+

packages/react/index.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,15 @@
1-
export { useSelector } from './useSelector'
1+
import { useState, useEffect } from 'react'
2+
import { unstable_batchedUpdates } from 'react-dom'
3+
4+
export const useStore = (store, selector) => {
5+
let [, force] = useState({})
6+
useEffect(() => {
7+
let cb = () => {
8+
unstable_batchedUpdates(() => {
9+
force({})
10+
})
11+
}
12+
return store._run ? store.listen(cb) : store.listen(selector, cb)
13+
}, [selector, store])
14+
return store.get(selector)
15+
}

packages/react/index.test.ts

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import '@testing-library/jest-dom/extend-expect'
2+
import React, { FC } from 'react'
3+
import ReactTesting from '@testing-library/react'
4+
import { createStore, bind } from 'dotto.x'
5+
6+
import { useStore } from './index'
7+
8+
let { render, screen, act } = ReactTesting
9+
let { createElement: h } = React
10+
11+
it('renders store', async () => {
12+
let renders = 0
13+
14+
let user = createStore({ name: 'John' })
15+
let project = createStore({ name: 'dotto' })
16+
17+
let Test1: FC = () => {
18+
renders += 1
19+
let uName = useStore(user, 'name')
20+
let pName = useStore(project, 'name')
21+
return h('div', { 'data-testid': 'test1' }, `${uName}-${pName}`)
22+
}
23+
24+
render(h(Test1))
25+
expect(screen.getByTestId('test1')).toHaveTextContent('John-dotto')
26+
expect(renders).toEqual(1)
27+
28+
await act(async () => {
29+
user.set('name', 'John Constantine')
30+
project.set('name', 'dotto.x')
31+
})
32+
33+
expect(screen.getByTestId('test1')).toHaveTextContent(
34+
'John Constantine-dotto.x'
35+
)
36+
expect(renders).toEqual(2)
37+
})
38+
39+
it('renders computed', async () => {
40+
let renders = 0
41+
42+
let user = createStore({ name: 'John' })
43+
let project = createStore({ name: 'dotto' })
44+
let userName = bind(user, 'name')
45+
let projectName = bind(project, 'name')
46+
47+
let Test1: FC = () => {
48+
renders += 1
49+
let uName = useStore(userName)
50+
let pName = useStore(projectName)
51+
return h('div', { 'data-testid': 'test1' }, `${uName}-${pName}`)
52+
}
53+
54+
render(h(Test1))
55+
expect(screen.getByTestId('test1')).toHaveTextContent('John-dotto')
56+
expect(renders).toEqual(1)
57+
58+
await act(async () => {
59+
userName.set('John Constantine')
60+
projectName.set('dotto.x')
61+
})
62+
63+
expect(screen.getByTestId('test1')).toHaveTextContent(
64+
'John Constantine-dotto.x'
65+
)
66+
expect(renders).toEqual(2)
67+
})

packages/react/useSelector/index.d.ts

-6
This file was deleted.

packages/react/useSelector/index.js

-19
This file was deleted.

packages/react/useSelector/index.test.ts

-11
This file was deleted.

scripts/foreach_workspace.sh

-10
This file was deleted.

0 commit comments

Comments
 (0)