All files / app/features/messages utils.ts

43.9% Statements 18/41
23.8% Branches 10/42
66.66% Functions 6/9
45% Lines 18/40

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110          5x   5x       21x     21x         178x 178x     44x 44x                 30x                         30x 30x 30x                                                               43x           43x                           53x 53x 53x       53x      
import { useLiteUsers } from "features/userQueries/useLiteUsers";
import { TFunction } from "i18next";
import { GroupChat } from "proto/conversations_pb";
import { Message } from "proto/messages_pb";
import { HostRequest } from "proto/requests_pb";
import { firstName } from "utils/names";
 
import { requestStatusChangedMessageToSelfTransKey, requestStatusChangedMessageToTransKey } from "./constants";
 
type Conversation = GroupChat.AsObject | HostRequest.AsObject;
 
export function hasUnreadMessages<T extends Conversation>(
  conversation: T,
): conversation is T & { latestMessage: Message.AsObject } {
  return (
    conversation.latestMessage !== undefined && conversation.lastSeenMessageId < conversation.latestMessage.messageId
  );
}
 
export function isControlMessage(message: Message.AsObject) {
  return !message.text;
}
 
export function messageTargetId(message: Message.AsObject) {
  return message.userInvited
    ? message.userInvited.targetUserId
    : message.userMadeAdmin
      ? message.userMadeAdmin.targetUserId
      : message.userRemovedAdmin
        ? message.userRemovedAdmin.targetUserId
        : undefined;
}
 
export function controlMessage({
  user,
  target_user,
  message,
  t,
  isCurrentUser,
}: {
  user: string;
  target_user?: string;
  message: Message.AsObject;
  t: TFunction<"messages", undefined>;
  isCurrentUser?: boolean;
}) {
  const userCap = user.charAt(0).toUpperCase() + user.slice(1);
  if (message.chatCreated) {
    return t("control_message.created_chat_text", { user: userCap });
  } else Eif (message.chatEdited) {
    return t("control_message.edited_chat_text", { user: userCap });
  } else if (message.userInvited) {
    return t("control_message.invite_user_text", {
      user: userCap,
      target_user,
    });
  } else if (message.userLeft) {
    return t("control_message.user_left_chat_text", { user: userCap });
  } else if (message.userMadeAdmin) {
    return t("control_message.admin_assignment_text", {
      user: userCap,
      target_user,
    });
  } else if (message.userRemovedAdmin) {
    return t("control_message.admin_removal_text", {
      user: userCap,
      target_user,
    });
  } else if (message.hostRequestStatusChanged) {
    const map = isCurrentUser ? requestStatusChangedMessageToSelfTransKey : requestStatusChangedMessageToTransKey;
    const transKey = map[message.hostRequestStatusChanged.status];
    if (transKey == null) {
      throw Error(t("control_message.unknown_message_text"));
    }
    return isCurrentUser ? t(transKey) : t(transKey, { user: userCap });
  } else {
    throw Error(t("control_message.unknown_message_text"));
  }
}
 
export function groupChatTitleText(
  groupChat: GroupChat.AsObject,
  groupChatMembersQuery: ReturnType<typeof useLiteUsers>,
  currentUserId: number,
  t: TFunction<"messages", undefined>,
) {
  return groupChat.title
    ? groupChat.title
    : groupChatMembersQuery.isLoading
      ? "Chat"
      : Array.from(groupChatMembersQuery.data?.values() ?? [])
          .filter((user) => user?.userId !== currentUserId)
          .map((user) => {
            const firstNameUser = firstName(user?.name);
            return firstNameUser === "" ? t("messages:unknown_user") : firstNameUser;
          })
          .join(", ");
}
 
/** Returns the other user's username, or null if there are more than 2 users. */
export function getDmUsername(groupChatMembersQuery: ReturnType<typeof useLiteUsers>, currentUserId: number) {
  const users = Array.from(groupChatMembersQuery.data?.values() ?? []);
  Iif (users.length === 2) {
    const username = users.find((user) => user?.userId !== currentUserId)?.username;
    return username ?? null;
  } else {
    return null;
  }
}