Skip to content

Commit 68b323d

Browse files
committed
refactor: remove effects to ngneat/effects
1 parent 012a548 commit 68b323d

File tree

6 files changed

+79
-105
lines changed

6 files changed

+79
-105
lines changed

README.md

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -77,54 +77,11 @@ function TodosComponent() {
7777
const [todos] = useObservable(todos$);
7878

7979
useEffect$(() => loadTodos());
80+
useEffect$(() => loadTodos(), deps);
8081

8182
return <>{todos}</>;
8283
}
8384
```
84-
85-
## useComponentEffects
86-
To use an `effect` we first need to create it by using the `createEffect` function:
87-
88-
```ts
89-
import { createEffect } from '@ngneat/react-rxjs';
90-
91-
export const searchTodoEffect = createEffect((searchTerm$: Observable<string>) => {
92-
return searchTerm$.pipe(
93-
debounceTime(300),
94-
switchMap((searchTerm) => fetchTodos({ searchTerm })),
95-
);
96-
});
97-
```
98-
99-
The `createEffect` function takes a `callback` function which is passed an `Observable` parameter and returns an `Observable`.
100-
101-
Now we can register the effect in our component, and call it when we need:
102-
103-
```ts
104-
import { useComponentEffects$ } from '@ngneat/react-rxjs';
105-
106-
function SearchComponent() {
107-
const searchTodo = useComponentEffects(searchTodoEffect);
108-
109-
return <input onChange={({ target: { value } }) => searchTodo(value)} />
110-
}
111-
```
112-
113-
Every time the `effect` is called, its value is pushed into that `Observable`.
114-
115-
116-
We can also register multiple effects:
117-
118-
```ts
119-
function FooComponent() {
120-
const [addTodo, updateTodo, deleteTodo] = useComponentEffects([
121-
addTodoEffect, updateTodoEffect, deleteTodoEffect
122-
]);
123-
124-
return ...
125-
}
126-
```
127-
12885
## useFromEvent
12986
It's the `fromEvent` observable, but with hooks:
13087

packages/playground/src/app/app.tsx

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,9 @@
1-
import { createEffect, useComponentEffects, useEffect$, useFromEvent, useObservable } from '@ngneat/react-rxjs';
2-
import { interval, Observable } from 'rxjs';
1+
import { useEffect$, useFromEvent, useObservable } from '@ngneat/react-rxjs';
2+
import { interval } from 'rxjs';
33
import { debounceTime, distinctUntilChanged, tap } from 'rxjs/operators';
44
import { fromFetch } from 'rxjs/fetch';
55
import { ChangeEvent, useState } from 'react';
66

7-
const searchTodoEffect = createEffect((searchTerm$: Observable<string>) => {
8-
return searchTerm$.pipe(
9-
debounceTime(300),
10-
tap({
11-
next(v) {
12-
console.log(v);
13-
}
14-
})
15-
);
16-
});
17-
18-
function SearchComponent() {
19-
const searchTodo = useComponentEffects(searchTodoEffect);
20-
21-
return <input onChange={({ target: { value } }) => searchTodo(value)} />
22-
}
23-
247
function loadTodos() {
258
return fromFetch<{ id: number }[]>('https://jsonplaceholder.typicode.com/todos', {
269
selector: (response) => response.json(),
@@ -59,7 +42,6 @@ export function App() {
5942
{count}
6043
<button onClick={() => setSideEffect(e => e + 1)}>sideEffect</button>
6144
<button onClick={() => setShow(show => !show)}>Toggle</button>
62-
{show && <SearchComponent />}
6345

6446
<h1>useFromEvent</h1>
6547
<h3>{text}</h3>

packages/react-rxjs/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export { useObservable } from './use-observable/use-observable';
22
export { useUntilDestroyed } from './use-until-destroyed/use-until-destroyed';
33
export { useEffect$ } from './use-effect/use-effect';
4-
export { useComponentEffects, createEffect } from './use-component-effects/use-component-effects';
54
export { useFromEvent } from './use-from-event/use-from-event';

packages/react-rxjs/src/use-component-effects/use-component-effects.ts

Lines changed: 0 additions & 40 deletions
This file was deleted.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
2+
import { Observable, timer } from 'rxjs';
3+
import { finalize, tap } from 'rxjs/operators';
4+
import { render } from '@testing-library/react';
5+
import { useEffect$ } from './use-effect';
6+
7+
jest.useFakeTimers();
8+
9+
describe('useEffect$', () => {
10+
const spy = jest.fn();
11+
const destroySpy = jest.fn();
12+
13+
const source$ = timer(1000).pipe(
14+
tap(spy),
15+
finalize(destroySpy)
16+
)
17+
18+
function FooComponent() {
19+
useEffect$(() => source$);
20+
21+
return <div></div>
22+
}
23+
24+
25+
it('should register/unregister effects', () => {
26+
const { unmount } = render(<FooComponent />);
27+
28+
jest.advanceTimersByTime(1000);
29+
30+
expect(spy).toHaveBeenCalledTimes(1);
31+
32+
unmount();
33+
34+
expect(destroySpy).toHaveBeenCalledTimes(1);
35+
36+
jest.useRealTimers();
37+
})
38+
})
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { finalize, tap } from 'rxjs/operators';
2+
import { render, fireEvent } from '@testing-library/react';
3+
import { ChangeEvent } from 'react';
4+
import { useFromEvent } from './use-from-event';
5+
6+
describe('useFromEvent', () => {
7+
const spy = jest.fn();
8+
const destroySpy = jest.fn();
9+
10+
function SearchComponent() {
11+
const { ref } = useFromEvent<ChangeEvent<HTMLInputElement>>('change', (event$) =>
12+
event$.pipe(
13+
tap(spy),
14+
finalize(destroySpy)
15+
)
16+
);
17+
18+
return <input data-testid="input" ref={ref} />
19+
}
20+
21+
22+
it('should register the event', () => {
23+
const { getByTestId, unmount } = render(<SearchComponent />);
24+
25+
fireEvent.change(getByTestId('input'));
26+
27+
expect(spy).toHaveBeenCalledTimes(1);
28+
29+
fireEvent.change(getByTestId('input'));
30+
31+
expect(spy).toHaveBeenCalledTimes(2);
32+
33+
unmount();
34+
35+
expect(destroySpy).toHaveBeenCalledTimes(1);
36+
37+
})
38+
})

0 commit comments

Comments
 (0)