/**
 * This file monitors the message cache to delete any queued messages that have already sent.
 */
import { Message } from "revolt.js";

import { useContext, useEffect } from "preact/hooks";

import { dispatch } from "../../redux";
import { connectState } from "../../redux/connector";
import { QueuedMessage } from "../../redux/reducers/queue";
import { Typing } from "../../redux/reducers/typing";

import { AppContext } from "./RevoltClient";

type Props = {
    messages: QueuedMessage[];
    typing: Typing;
};

function StateMonitor(props: Props) {
    const client = useContext(AppContext);

    useEffect(() => {
        dispatch({
            type: "QUEUE_DROP_ALL",
        });
    }, []);

    useEffect(() => {
        function add(msg: Message) {
            if (!msg.nonce) return;
            if (!props.messages.find((x) => x.id === msg.nonce)) return;

            dispatch({
                type: "QUEUE_REMOVE",
                nonce: msg.nonce,
            });
        }

        client.addListener("message", add);
        return () => client.removeListener("message", add);
    }, [props.messages]);

    useEffect(() => {
        function removeOld() {
            if (!props.typing) return;
            for (const channel of Object.keys(props.typing)) {
                const users = props.typing[channel];

                for (const user of users) {
                    if (+new Date() > user.started + 5000) {
                        dispatch({
                            type: "TYPING_STOP",
                            channel,
                            user: user.id,
                        });
                    }
                }
            }
        }

        removeOld();

        const interval = setInterval(removeOld, 1000);
        return () => clearInterval(interval);
    }, [props.typing]);

    return null;
}

export default connectState(StateMonitor, (state) => {
    return {
        messages: [...state.queue],
        typing: state.typing,
    };
});