All files / app/features/messages utils.ts

43.9% Statements 18/41
24.39% Branches 10/41
66.66% Functions 6/9
43.9% Lines 18/41

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 111 112 113 114 115 116 117 118 119 120 121 122        4x         4x       11x     11x           168x 168x     58x 58x                 30x                         30x 30x 30x                                                                   33x           33x                               53x       53x 53x           53x      
import { useLiteUsers } from "features/userQueries/useLiteUsers";
import { TFunction } from "i18next";
import { GroupChat, Message } from "proto/conversations_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];
    Iif (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;
  }
}