diff --git a/src/lib/auth.ts b/src/lib/auth.ts index df7c3a4..4f95497 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -4,6 +4,7 @@ import { Dispatch, RefObject, SetStateAction } from "react"; import { get } from "./request"; import { toast } from "sonner"; import { MessageStore } from "@/hooks/use-messages"; +import { IndicatorContext, ServerMessage } from "@/types/protocol"; type AuthParams = { id: string; @@ -11,6 +12,7 @@ type AuthParams = { setServer?: Dispatch>; onNewMessage?: (m: Message) => void; messageStore: MessageStore; + onIndicator?: (i: IndicatorContext) => void; }; export default async function auth({ @@ -19,6 +21,7 @@ export default async function auth({ setServer, onNewMessage, messageStore, + onIndicator, }: AuthParams) { console.log("Authenticating with server id:", id); @@ -42,7 +45,7 @@ export default async function auth({ }; ws.onmessage = (m) => { - const data = JSON.parse(m.data); + var data = JSON.parse(m.data); console.log("Message received:", data); if (data.error) { @@ -64,7 +67,9 @@ export default async function auth({ return; } - switch (data.type) { + const msg = data as ServerMessage; + + switch (msg.type) { case "authenticated": // ws.send( // JSON.stringify({ @@ -78,19 +83,23 @@ export default async function auth({ break; case "message_create": - if (onNewMessage) onNewMessage(data.params as Message); - messageStore.addMessage(data.params as Message); + if (onNewMessage) onNewMessage(msg.params as Message); + messageStore.addMessage(msg.params as Message); break; case "message_delete": - messageStore.deleteMessage(data.params.message_id); + messageStore.deleteMessage(msg.params.message_id); break; case "message_update": - messageStore.editMessage(data.params.message_id, data.params.contents); + messageStore.editMessage(msg.params.message_id, msg.params.contents); break; case "chunk": - messageStore.insertMessages(data.params); + messageStore.insertMessages(msg.params); + break; + case "indicator": + if (!onIndicator) break; + onIndicator(msg.params); break; } }; diff --git a/src/types/protocol.ts b/src/types/protocol.ts index dfb7c51..052186a 100644 --- a/src/types/protocol.ts +++ b/src/types/protocol.ts @@ -1,11 +1,34 @@ -export interface MessageType { +import { Message } from "./types"; + +export interface EnumType { type: T; params: P; } +export type Indicator = EnumType< + "typing", + { user_id: string; channel_id: string } +>; + +export interface IndicatorContext { + indicator: Indicator; + expires: number; +} + export type ClientMessage = - | MessageType<"send_message", { channel_id: string; contents: string }> - | MessageType<"delete_message", { message_id: number }> - | MessageType<"edit_message", { message_id: number; new_contents: string }> - | MessageType<"load_chunk", { channel_id: string; chunk_id: number }> - | MessageType<"typing", { channel_id: string }>; + | EnumType<"send_message", { channel_id: string; contents: string }> + | EnumType<"delete_message", { message_id: number }> + | EnumType<"edit_message", { message_id: number; new_contents: string }> + | EnumType<"load_chunk", { channel_id: string; chunk_id: number }> + | EnumType<"typing", { channel_id: string }>; + +export type ServerMessage = + | EnumType<"authenticated", { uuid: string; indicators: IndicatorContext[] }> + | EnumType<"temp_message", { message: string }> + | EnumType<"message_create", Message> + | EnumType<"message_update", { message_id: number; contents: string }> + | EnumType<"message_delete", { message_id: number }> + | EnumType<"presence_update", { user_id: String; status: String }> + | EnumType<"indicator", IndicatorContext> + | EnumType<"shutdown", { message: string }> + | EnumType<"chunk", Message[]>;