Skip to content

Commit 7c6441a

Browse files
author
Grzegorz Kupczyk
committed
Read server side events for organisations
1 parent 9b1750c commit 7c6441a

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import {
2+
createContext,
3+
useContext,
4+
useState,
5+
PropsWithChildren,
6+
useEffect,
7+
} from "react";
8+
9+
interface EventListenerContextData {
10+
data: unknown;
11+
listener: EventSource;
12+
}
13+
14+
type EventListenerProps = PropsWithChildren<{
15+
url: string;
16+
}>;
17+
18+
export const EventListenerContext =
19+
createContext<EventListenerContextData | null>(null);
20+
21+
export const EventListenerProvider = ({
22+
url,
23+
children,
24+
}: EventListenerProps) => {
25+
const [data, setData] = useState<unknown>(null);
26+
const [listener, setListener] = useState<EventSource | null>(null);
27+
28+
useEffect(() => {
29+
const list = new EventSource(url);
30+
list.onmessage = ({ data }) => {
31+
setData(data);
32+
};
33+
setListener(list);
34+
}, []);
35+
36+
return (
37+
<EventListenerContext.Provider value={{ data, listener }}>
38+
{children}
39+
</EventListenerContext.Provider>
40+
);
41+
};
42+
43+
export const useEventListener = () => {
44+
const contextData = useContext(EventListenerContext);
45+
46+
if (!contextData) {
47+
throw new Error("bruh");
48+
}
49+
50+
return contextData;
51+
};

frontend/pages/organisations.tsx

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,26 @@
11
import { AuthorizedLayout } from "../components/Layout";
2+
import {
3+
EventListenerContext,
4+
EventListenerProvider,
5+
// useEventListener,
6+
} from "../features/EventsSteam/EventListener";
27

38
const Organisation = () => {
9+
const streamURL = "/api/organisation/stream";
10+
// const eventListenerContext = useEventListener();
11+
412
return (
513
<AuthorizedLayout>
6-
To ma wylecieć
14+
<EventListenerProvider url={streamURL}>
15+
<EventListenerContext.Consumer>
16+
{(organizationsContext) => (
17+
<>
18+
Organizancje są takie o:
19+
<pre>{JSON.stringify(organizationsContext)}</pre>
20+
</>
21+
)}
22+
</EventListenerContext.Consumer>
23+
</EventListenerProvider>
724
</AuthorizedLayout>
825
);
926
};

0 commit comments

Comments
 (0)