sparkletown/sparkle

View on GitHub
src/hooks/chats/private/useRecipientChatActions.ts

Summary

Maintainability
A
1 hr
Test Coverage
import { useCallback, useMemo } from "react";

import { getUserChatsCollectionRef, setChatMessageRead } from "api/chat";

import {
  MarkMessageRead,
  PrivateChatActions,
  PrivateChatMessage,
} from "types/chat";
import { DisplayUser } from "types/User";

import { pickDisplayUserFromUser } from "utils/chat";
import { WithId } from "utils/id";

import {
  useSendChatMessage,
  useSendThreadMessage,
} from "hooks/chats/common/useSendMessage";
import { useUser } from "hooks/useUser";

export const useRecipientChatActions = (
  recipient: WithId<DisplayUser>
): PrivateChatActions => {
  const { userId } = useUser();

  const refs = useMemo(() => {
    if (!userId) return [];

    const authorRef = getUserChatsCollectionRef(userId);
    const recipientRef = getUserChatsCollectionRef(recipient.id);
    return [authorRef, recipientRef];
  }, [recipient.id, userId]);

  const markMessageRead: MarkMessageRead = useCallback(
    async (messageId: string) => {
      if (!userId) return;

      return setChatMessageRead({ userId, messageId });
    },
    [userId]
  );

  const additionalMessageFields = useMemo(
    () => ({
      toUser: pickDisplayUserFromUser(recipient),
    }),
    [recipient]
  );

  const sendMessage = useSendChatMessage<PrivateChatMessage>(
    refs,
    additionalMessageFields
  );
  const sendThreadReply = useSendThreadMessage<PrivateChatMessage>(
    refs,
    additionalMessageFields
  );

  return useMemo(
    () => ({
      sendChatMessage: sendMessage,
      sendThreadMessage: sendThreadReply,
      markMessageRead,
    }),
    [markMessageRead, sendMessage, sendThreadReply]
  );
};