@@ -139,17 +139,19 @@ If you use Redux you can get the actual value directly from the store instance.
139
139
140
140
``` typescript
141
141
// full example: https://snack.expo.dev/@quiknull/react-native-sse-redux-example
142
+ type CustomEvents = " ping" ;
143
+
142
144
const Example: React .FC = () => {
143
- const userName = useSelector ((state : RootState ) => state .user .name );
145
+ const name = useSelector ((state : RootState ) => state .user .name );
144
146
145
- const pingHandler: EventSourceListener = useCallback (
147
+ const pingHandler: EventSourceListener < CustomEvents , ' ping ' > = useCallback (
146
148
(event ) => {
147
149
// In Event Source Listeners in connection with redux
148
150
// you should read state directly from store object.
149
- console .log (" User name from component selector: " , userName ); // bad
151
+ console .log (" User name from component selector: " , name ); // bad
150
152
console .log (" User name directly from store: " , store .getState ().user .name ); // good
151
153
},
152
- [userName ]
154
+ []
153
155
);
154
156
155
157
useEffect (() => {
@@ -160,7 +162,7 @@ const Example: React.FC = () => {
160
162
" https://example.com/my-private-topic"
161
163
);
162
164
163
- const es = new EventSource (url , {
165
+ const es = new EventSource < CustomEvents > (url , {
164
166
headers: {
165
167
Authorization: {
166
168
toString : function () {
@@ -201,7 +203,7 @@ const options: EventSourceOptions = {
201
203
Using EventSource you can handle custom events invoked by the server:
202
204
203
205
``` typescript
204
- import EventSource from " react-native-sse" ;
206
+ import EventSource , { EventSourceListener , EventSourceEvent } from " react-native-sse" ;
205
207
206
208
type MyCustomEvents = " ping" | " clientConnected" | " clientDisconnected" ;
207
209
@@ -226,6 +228,57 @@ es.addEventListener("clientDisconnected", (event) => {
226
228
});
227
229
```
228
230
231
+ Using one listener for all events:
232
+
233
+ ``` typescript
234
+ import EventSource , { EventSourceListener } from " react-native-sse" ;
235
+
236
+ type MyCustomEvents = " ping" | " clientConnected" | " clientDisconnected" ;
237
+
238
+ const es = new EventSource <MyCustomEvents >(
239
+ " https://your-sse-server.com/.well-known/hub"
240
+ );
241
+
242
+ const listener: EventSourceListener <MyCustomEvents > = (event ) => {
243
+ if (event .type === ' open' ) {
244
+ // connection opened
245
+ } else if (event .type === ' message' ) {
246
+ // ...
247
+ } else if (event .type === ' ping' ) {
248
+ // ...
249
+ }
250
+ }
251
+ es .addEventListener (' open' , listener );
252
+ es .addEventListener (' message' , listener );
253
+ es .addEventListener (' ping' , listener );
254
+ ```
255
+
256
+ Using generic type for one event:
257
+
258
+ ``` typescript
259
+ import EventSource , { EventSourceListener , EventSourceEvent } from " react-native-sse" ;
260
+
261
+ type MyCustomEvents = " ping" | " clientConnected" | " clientDisconnected" ;
262
+
263
+ const es = new EventSource <MyCustomEvents >(
264
+ " https://your-sse-server.com/.well-known/hub"
265
+ );
266
+
267
+ const pingListener: EventSourceListener <MyCustomEvents , ' ping' > = (event ) => {
268
+ // ...
269
+ }
270
+ // or
271
+ const pingListener = (event : EventSourceEvent <' ping' , MyCustomEvents >) => {
272
+ // ...
273
+ }
274
+
275
+ es .addEventListener (' ping' , pingListener );
276
+ ```
277
+
278
+ ` MyCustomEvents ` in ` EventSourceEvent ` is optional, but it's recommended to use it in order to have better type checking.
279
+
280
+ ---
281
+
229
282
Custom events always emit result with following interface:
230
283
231
284
``` typescript
0 commit comments