2023-11-17 10:25:38 +03:00
|
|
|
"use client";
|
|
|
|
|
|
|
|
|
|
import React from "react";
|
|
|
|
|
import { waku, Waku, WakuEvents } from "@/services/waku";
|
2023-11-23 16:43:30 +01:00
|
|
|
import { WakuStatus } from "@/const";
|
|
|
|
|
import { Loading } from "./Loading";
|
2023-11-17 10:25:38 +03:00
|
|
|
|
|
|
|
|
type WakuContextProps = {
|
2023-11-23 16:43:30 +01:00
|
|
|
status: WakuStatus;
|
|
|
|
|
waku?: Waku;
|
2023-11-17 10:25:38 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const WakuContext = React.createContext<WakuContextProps>({
|
2023-11-23 16:43:30 +01:00
|
|
|
status: WakuStatus.Initializing,
|
|
|
|
|
waku: undefined,
|
2023-11-17 10:25:38 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
type WakuProviderProps = {
|
|
|
|
|
children: React.ReactNode;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const useWaku = () => {
|
2023-11-23 16:43:30 +01:00
|
|
|
const { status, waku } = React.useContext(WakuContext);
|
2023-11-17 10:25:38 +03:00
|
|
|
|
2023-11-23 16:43:30 +01:00
|
|
|
return { status, waku };
|
2023-11-17 10:25:38 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const WakuProvider = (props: WakuProviderProps) => {
|
|
|
|
|
const wakuRef = React.useRef<Waku>();
|
2023-11-23 16:43:30 +01:00
|
|
|
const [status, setStatus] = React.useState<WakuStatus>(
|
|
|
|
|
WakuStatus.Initializing
|
|
|
|
|
);
|
2023-11-17 10:25:38 +03:00
|
|
|
|
|
|
|
|
React.useEffect(() => {
|
|
|
|
|
if (wakuRef.current) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const statusListener = (event: CustomEvent) => {
|
|
|
|
|
setStatus(event.detail);
|
|
|
|
|
};
|
|
|
|
|
waku.addEventListener(WakuEvents.Status, statusListener);
|
|
|
|
|
|
|
|
|
|
waku.init().then(() => {
|
|
|
|
|
wakuRef.current = waku;
|
|
|
|
|
});
|
|
|
|
|
return () => {
|
|
|
|
|
waku.removeEventListener(WakuEvents.Status, statusListener);
|
|
|
|
|
};
|
|
|
|
|
}, [wakuRef, setStatus]);
|
|
|
|
|
|
2023-11-23 16:43:30 +01:00
|
|
|
if (status === WakuStatus.Failed) {
|
|
|
|
|
return <>{status}</>;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (status !== WakuStatus.Connected) {
|
|
|
|
|
return <Loading />;
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 10:25:38 +03:00
|
|
|
return (
|
2023-11-23 16:43:30 +01:00
|
|
|
<WakuContext.Provider value={{ status, waku: wakuRef.current }}>
|
2023-11-17 10:25:38 +03:00
|
|
|
{props.children}
|
|
|
|
|
</WakuContext.Provider>
|
|
|
|
|
);
|
|
|
|
|
};
|