-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Feat(modules-event-event): create hook for observing events (#1076)
* fix(module-event): expose event stream expose event stream from `IEventModuleProvider` * feat(react-module-event): create hook for observing events * docs: update event module docs
- Loading branch information
Showing
9 changed files
with
201 additions
and
69 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
'@equinor/fusion-framework-module-event': patch | ||
--- | ||
|
||
expose event stream from `IEventModuleProvider` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
--- | ||
'@equinor/fusion-framework-react-module-event': minor | ||
--- | ||
|
||
Add hook for observing event streams | ||
|
||
```ts | ||
/* observe stream of events */ | ||
const someEvent$ = useEventStream( | ||
'some_event', | ||
useCallback( | ||
(event$) => event$.pipe( | ||
// only some events | ||
filter(e => e.detail.foo === dep.foo), | ||
// mutate data | ||
map(e => e.detail) | ||
) | ||
), [dep] | ||
); | ||
/* use state of stream */ | ||
const someEvent = useObservableState(someEvent$); | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
import { useMemo } from 'react'; | ||
|
||
import { Observable, OperatorFunction } from 'rxjs'; | ||
|
||
import { FrameworkEventMap, filterEvent } from '@equinor/fusion-framework-module-event'; | ||
import { useEventProvider } from 'EventProvider'; | ||
|
||
export type EventStream<TKey extends keyof FrameworkEventMap = keyof FrameworkEventMap> = | ||
Observable<FrameworkEventMap[TKey]>; | ||
|
||
/** | ||
* Hook for observing events | ||
* | ||
* @param key name of the event to filter out | ||
* @param operator [optional] {@link OperatorFunction} for transforming the stream __must be memorized!__ | ||
*/ | ||
export const useEventStream = < | ||
TKey extends keyof FrameworkEventMap = keyof FrameworkEventMap, | ||
TData = FrameworkEventMap[TKey] | ||
>( | ||
key: TKey, | ||
operator?: OperatorFunction<FrameworkEventMap[TKey], TData> | ||
): Observable<TData> => { | ||
const provider = useEventProvider(); | ||
return useMemo(() => { | ||
return provider.event$.pipe(filterEvent(key), operator ?? ((x) => x as Observable<TData>)); | ||
}, [provider, key, operator]); | ||
}; | ||
|
||
export default useEventStream; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
--- | ||
title: Event Module - React | ||
category: Module | ||
tag: | ||
- react | ||
- event | ||
--- | ||
|
||
<ModuleBadge module="/react/modules/event" package="@equinor/fusion-framework-react-module-event"/> | ||
|
||
```ts | ||
import { useEventProvider } from '@equinor/fusion-framework-react-module-event'; | ||
|
||
/* fetch the `ÌEventModuleProvider` from the closes module provder */ | ||
const eventProvider = useEventProvider(); | ||
``` | ||
|
||
## EventProvider | ||
|
||
if needed, the resolving of which `ÌEventModuleProvider` the `useEventProvider` will provide can be altered by using | ||
the `EventProvider` component | ||
|
||
**example app:** | ||
```tsx | ||
import { EventProvider, EventConsumer } = from '@equinor/fusion-framework-react-module-event'; | ||
import { useFramework } = from '@equinor/fusion-framework-react-app/framework'; | ||
const Content = () => { | ||
const framework = useFramework().modules.event; | ||
return ( | ||
<EventProvider value={framework.modules.event}> | ||
<EventLogger /> | ||
<InlineEventConsumer /> | ||
<EventProvider> | ||
); | ||
}; | ||
``` | ||
```tsx | ||
import { useEventHandler } = from '@equinor/fusion-framework-react-module-event'; | ||
|
||
const eventHandler = (event: FrameworkEventMap['some_event']) => { | ||
console.log(event.detail); | ||
}; | ||
|
||
const EventLogger = () => useEventHandler('some_event', eventHandler); | ||
``` | ||
|
||
```tsx | ||
import { EventConsumer } = from '@equinor/fusion-framework-react-module-event'; | ||
|
||
const InlineEventConsumer = () => ( | ||
<EventConsumer> | ||
{ | ||
(provider) => provider.dispatch( | ||
'some_event'), | ||
{ detail: { foo: 'bar' } } | ||
} | ||
</EventConsumer> | ||
) | ||
`````` | ||
|
||
## Hooks | ||
|
||
### useEventProvider | ||
|
||
use `IEventModuleProvider` from current context see [EventProvider](#EventProvider) | ||
```ts | ||
import { useEventProvider } from '@equinor/fusion-framework-react-module-event'; | ||
``` | ||
|
||
### useEventModuleProvider | ||
|
||
use `IEventModuleProvider` from closes module provider | ||
|
||
```ts | ||
import { useEventModuleProvider } from '@equinor/fusion-framework-react-module-event'; | ||
``` | ||
|
||
|
||
### useEventHandler | ||
```ts | ||
import { useEventHandler } from '@equinor/fusion-framework-react-module-event'; | ||
|
||
useEventHandler( | ||
'onContextChange', | ||
/** note that callback must be memorized */ | ||
useCallback((e) => { | ||
console.log(e.detail); | ||
}, [deps]); | ||
); | ||
``` | ||
|
||
### useEventStream | ||
|
||
```ts | ||
import { useEventStream, EventStream } from '@equinor/fusion-framework-react-module-event'; | ||
|
||
/* simple usage */ | ||
const { value: someEvent } = useObservableState(useEventStream('some_event')); | ||
|
||
/* observe stream of events */ | ||
const someEvent$ = useEventStream( | ||
'some_event', | ||
/* note that callback must be memorized */ | ||
useCallback( | ||
/* note react.useCallback cannot resolve source input */ | ||
(event$: EventStream<'some_event'>) => event$.pipe( | ||
/* only some events */ | ||
filter(e => e.detail.foo === dep.foo), | ||
/* mutate data */ | ||
map(e => e.detail) | ||
), | ||
[dep] | ||
) | ||
); | ||
/* use state of stream */ | ||
const { value: foo } = useObservableState(someEvent$); | ||
|
||
``` |