Skip to content

Commit

Permalink
Read server side events for organisations
Browse files Browse the repository at this point in the history
  • Loading branch information
Grzegorz Kupczyk committed Dec 22, 2023
1 parent 9b1750c commit 7c6441a
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 1 deletion.
51 changes: 51 additions & 0 deletions frontend/features/EventsSteam/EventListener.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import {
createContext,
useContext,
useState,
PropsWithChildren,
useEffect,
} from "react";

interface EventListenerContextData {
data: unknown;
listener: EventSource;
}

type EventListenerProps = PropsWithChildren<{
url: string;
}>;

export const EventListenerContext =
createContext<EventListenerContextData | null>(null);

export const EventListenerProvider = ({
url,
children,
}: EventListenerProps) => {
const [data, setData] = useState<unknown>(null);
const [listener, setListener] = useState<EventSource | null>(null);

useEffect(() => {
const list = new EventSource(url);
list.onmessage = ({ data }) => {
setData(data);
};
setListener(list);
}, []);

return (
<EventListenerContext.Provider value={{ data, listener }}>
{children}
</EventListenerContext.Provider>
);
};

export const useEventListener = () => {
const contextData = useContext(EventListenerContext);

if (!contextData) {
throw new Error("bruh");
}

return contextData;
};
19 changes: 18 additions & 1 deletion frontend/pages/organisations.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,26 @@
import { AuthorizedLayout } from "../components/Layout";
import {
EventListenerContext,
EventListenerProvider,
// useEventListener,
} from "../features/EventsSteam/EventListener";

const Organisation = () => {
const streamURL = "/api/organisation/stream";
// const eventListenerContext = useEventListener();

return (
<AuthorizedLayout>
To ma wylecieć
<EventListenerProvider url={streamURL}>
<EventListenerContext.Consumer>
{(organizationsContext) => (
<>
Organizancje są takie o:
<pre>{JSON.stringify(organizationsContext)}</pre>
</>
)}
</EventListenerContext.Consumer>
</EventListenerProvider>
</AuthorizedLayout>
);
};
Expand Down

0 comments on commit 7c6441a

Please # to comment.