import type { AppRouter } from "@thorium/.server/init/router"; import { clientId, q } from "@thorium/context/AppContext"; import useEventListener, { LongRangeCommSelectEvent } from "@thorium/hooks/useEventListener"; import { useStation } from "@thorium/routes/station/useStation"; import Button from "@thorium/ui/Button"; import { cn } from "@thorium/utils/cn"; import type { inferProcedureInput } from "@thorium/utils/live-query/.server/types"; import { fromDate } from "dot-beat-time"; import { useMemo, useRef, useState } from "react"; import { ReplacementDecoder } from "./ReplacementDecoder"; import { RotationDecoder } from "./RotationDecoder"; import { useRandomCharacterState } from "./useRandomCharacterState"; import { WavesDecoder } from "./WavesDecoder"; export function InboxPage() { const { shipId } = useStation(); const [incomingMessages] = q.longRangeComm.incomingMessages.useNetRequest({ shipId, }); const [selectedMessageId, setSelectedMessageId] = useState(null); const selectedMessage = incomingMessages.find((s) => s.id === selectedMessageId); const selectedIsIntercepted = selectedMessage && selectedMessage.destinationId !== shipId; const [encodedMessage, setEncodedMessage] = useRandomCharacterState( selectedMessage?.encodedMessage || "", ); const [localDecoding, setLocalDecoding] = useState< inferProcedureInput["decoding"] | undefined >(selectedMessage?.encoding); const messageDecodingAbortController = useRef(new AbortController()); const updateMessageDecoding = useMemo( () => async ( messageId: number, decoding: inferProcedureInput< AppRouter["longRangeComm"]["updateMessageDecoding"] >["decoding"], ) => { messageDecodingAbortController.current.abort(); messageDecodingAbortController.current = new AbortController(); const { encodedMessage: newMessage } = await q.longRangeComm.updateMessageDecoding.netSend( { messageId, decoding, }, { signal: messageDecodingAbortController.current.signal }, ); return newMessage; }, [], ); function selectMessage(id: number) { setSelectedMessageId(id); const selectedMessage = incomingMessages.find((s) => s.id === id); const message = selectedMessage?.encodedMessage || ""; setEncodedMessage(message, message, true); setLocalDecoding(selectedMessage?.encoding); q.longRangeComm.updateMessageDecoding.netSend({ messageId: id, decoding: selectedMessage!.encoding, }); q.thorium.genericEvent.netSend({ clientId, eventName: "long-range-inbox-pick", properties: `${id}`, }); } useEventListener(LongRangeCommSelectEvent.name, (event: LongRangeCommSelectEvent) => selectMessage(event.messageId), ); return (

Incoming Messages

    {incomingMessages.map((m) => { const isIntercepted = m.destinationId !== shipId; return (
  • selectMessage(m.id)} > {m.unread ? ( ) : null} {m.senderShipName} {isIntercepted ? ( To: {m.destinationShipName} ) : null}
    {fromDate(new Date(m.timestamp))}
  • ); })}
{selectedMessage ? ( localDecoding?.type === "rotation" ? ( { setLocalDecoding(decoding); const newMessage = await updateMessageDecoding(selectedMessage.id, decoding); if (newMessage) { setEncodedMessage(encodedMessage, newMessage); } }} /> ) : localDecoding?.type === "replacement" ? ( { setLocalDecoding(decoding); const newMessage = await updateMessageDecoding(selectedMessage.id, decoding); if (newMessage) { setEncodedMessage(newMessage, newMessage, true); } }} /> ) : localDecoding?.type === "waves" ? ( { setLocalDecoding(decoding); const newMessage = await updateMessageDecoding(selectedMessage.id, decoding); if (newMessage) { setEncodedMessage(newMessage, newMessage, true); } }} /> ) : null ) : null}
{encodedMessage}
{selectedIsIntercepted ? (
) : null}
); }