1
1
import has from "lodash/has" ;
2
+ import { useEffect , useState } from "react" ;
2
3
import { PagedCollection } from "../types/Collection" ;
3
4
import { normalize } from "./dataAccess" ;
4
- import { useEffect , useState } from "react" ;
5
5
6
- const mercureSubscribe = ( hubURL : string , data : any | PagedCollection < any > , setData : Function ) => {
6
+ const mercureSubscribe = ( hubURL : string , data : any | PagedCollection < any > , setData : ( data : any ) => void ) => {
7
7
const url = new URL ( hubURL , window . origin ) ;
8
8
url . searchParams . append ( "topic" , ( new URL ( data [ "@id" ] , window . origin ) ) . toString ( ) ) ;
9
9
const eventSource = new EventSource ( url . toString ( ) ) ;
@@ -30,22 +30,28 @@ export const useMercure = (deps: any | PagedCollection<any>, hubURL: string) =>
30
30
}
31
31
32
32
useEffect ( ( ) => {
33
- if ( has ( data , "{{{hydraPrefix}}}member" ) && typeof data [ "{{{hydraPrefix}}}member" ] !== "undefined" && data [ "{{{hydraPrefix}}}member" ] . length !== 0 ) {
33
+ if ( has ( data , "{{{hydraPrefix}}}member" ) && Array . isArray ( data [ "{{{hydraPrefix}}}member" ] ) && data [ "{{{hydraPrefix}}}member" ] . length !== 0 ) {
34
34
// It's a PagedCollection
35
35
data [ "{{{hydraPrefix}}}member" ] . forEach ( ( obj , pos ) => mercureSubscribe ( hubURL , obj , ( datum ) => {
36
36
data [ "{{{hydraPrefix}}}member" ] [ pos ] = datum ;
37
37
setData ( data ) ;
38
38
} ) ) ;
39
- } else {
40
- // It's a single object
41
- const eventSource = mercureSubscribe ( hubURL , data , setData ) ;
42
39
43
40
return ( ) => {
44
41
eventSource . removeEventListener ( "message" , setData ) ;
45
42
46
43
return data ;
47
- }
44
+ } ;
48
45
}
46
+
47
+ // It's a single object
48
+ const eventSource = mercureSubscribe ( hubURL , data , setData ) ;
49
+
50
+ return ( ) => {
51
+ eventSource . removeEventListener ( "message" , setData ) ;
52
+
53
+ return data ;
54
+ } ;
49
55
} , [ data ] ) ;
50
56
51
57
return data ;
0 commit comments