56 lines
1.3 KiB
TypeScript
Raw Normal View History

2023-10-30 23:57:10 +01:00
import React from "react";
2023-11-01 01:52:51 +01:00
import { CONTENT_TOPIC } from "@/constants";
import { Message, waku } from "@/services/waku";
export type MessageContent = {
nick: string;
text: string;
time: string;
};
2023-10-30 23:57:10 +01:00
export const useWaku = () => {
const [messages, setMessages] = React.useState<MessageContent[]>([]);
React.useEffect(() => {
2023-11-01 01:52:51 +01:00
const messageListener = (event: CustomEvent) => {
const messages: Message[] = event.detail;
const parsedMessaged = messages.map((message) => {
const time = new Date(message.timestamp);
const payload = JSON.parse(atob(message.payload));
return {
nick: payload?.nick || "unknown",
text: payload?.text || "empty",
time: time.toDateString(),
};
});
setMessages((prev) => [...prev, ...parsedMessaged]);
2023-10-30 23:57:10 +01:00
};
2023-11-07 00:50:47 +01:00
waku.relay.addEventListener(CONTENT_TOPIC, messageListener);
2023-10-30 23:57:10 +01:00
return () => {
2023-11-07 00:50:47 +01:00
waku.relay.removeEventListener(CONTENT_TOPIC, messageListener);
2023-10-30 23:57:10 +01:00
};
2023-11-01 01:52:51 +01:00
}, [setMessages]);
2023-10-30 23:57:10 +01:00
const onSend = React.useCallback(
async (nick: string, text: string) => {
2023-11-07 00:50:47 +01:00
await waku.relay.send({
2023-11-01 01:52:51 +01:00
version: 0,
timestamp: Date.now(),
contentTopic: CONTENT_TOPIC,
payload: btoa(JSON.stringify({
nick,
text
})),
});
2023-10-30 23:57:10 +01:00
},
2023-11-01 01:52:51 +01:00
[]
2023-10-30 23:57:10 +01:00
);
return { onSend, messages };
};
2023-11-01 01:52:51 +01:00