You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
6.1 KiB
TypeScript
172 lines
6.1 KiB
TypeScript
import { useSelector } from 'react-redux';
|
|
import { UserUtils } from '../../session/utils';
|
|
import {
|
|
LastMessageStatusType,
|
|
MessageModelPropsWithConvoProps,
|
|
PropsForAttachment,
|
|
PropsForQuote,
|
|
ReduxConversationType,
|
|
} from '../ducks/conversations';
|
|
import { StateType } from '../reducer';
|
|
import { getIsMessageSelected, getMessagePropsByMessageId } from './conversations';
|
|
import { useSelectedIsPrivate } from './selectedConversation';
|
|
|
|
function useMessagePropsByMessageId(messageId: string | undefined) {
|
|
return useSelector((state: StateType) => getMessagePropsByMessageId(state, messageId));
|
|
}
|
|
|
|
const useSenderConvoProps = (
|
|
msgProps: MessageModelPropsWithConvoProps | undefined
|
|
): ReduxConversationType | undefined => {
|
|
return useSelector((state: StateType) => {
|
|
const sender = msgProps?.propsForMessage.sender;
|
|
if (!sender) {
|
|
return undefined;
|
|
}
|
|
return state.conversations.conversationLookup[sender] || undefined;
|
|
});
|
|
};
|
|
|
|
export const useAuthorProfileName = (messageId: string): string | null => {
|
|
const msg = useMessagePropsByMessageId(messageId);
|
|
const senderProps = useSenderConvoProps(msg);
|
|
if (!msg || !senderProps) {
|
|
return null;
|
|
}
|
|
|
|
const senderIsUs = msg.propsForMessage.sender === UserUtils.getOurPubKeyStrFromCache();
|
|
|
|
const authorProfileName = senderIsUs
|
|
? window.i18n('you')
|
|
: senderProps.nickname || senderProps.displayNameInProfile || window.i18n('anonymous');
|
|
return authorProfileName || window.i18n('unknown');
|
|
};
|
|
|
|
export const useAuthorName = (messageId: string): string | null => {
|
|
const msg = useMessagePropsByMessageId(messageId);
|
|
const senderProps = useSenderConvoProps(msg);
|
|
if (!msg || !senderProps) {
|
|
return null;
|
|
}
|
|
|
|
const authorName = senderProps.nickname || senderProps.displayNameInProfile || null;
|
|
return authorName;
|
|
};
|
|
|
|
export const useAuthorAvatarPath = (messageId: string): string | null => {
|
|
const msg = useMessagePropsByMessageId(messageId);
|
|
const senderProps = useSenderConvoProps(msg);
|
|
if (!msg || !senderProps) {
|
|
return null;
|
|
}
|
|
|
|
return senderProps.avatarPath || null;
|
|
};
|
|
|
|
export const useMessageIsDeleted = (messageId: string): boolean => {
|
|
const props = useMessagePropsByMessageId(messageId);
|
|
return props?.propsForMessage.isDeleted || false;
|
|
};
|
|
|
|
export const useFirstMessageOfSeries = (messageId: string | undefined): boolean => {
|
|
return useMessagePropsByMessageId(messageId)?.firstMessageOfSeries || false;
|
|
};
|
|
|
|
export const useLastMessageOfSeries = (messageId: string | undefined): boolean => {
|
|
return useMessagePropsByMessageId(messageId)?.lastMessageOfSeries || false;
|
|
};
|
|
|
|
export const useMessageAuthor = (messageId: string | undefined): string | undefined => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.sender;
|
|
};
|
|
|
|
export const useMessageDirection = (messageId: string | undefined): string | undefined => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.direction;
|
|
};
|
|
|
|
export const useMessageLinkPreview = (messageId: string | undefined): Array<any> | undefined => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.previews;
|
|
};
|
|
|
|
export const useMessageAttachments = (
|
|
messageId: string | undefined
|
|
): Array<PropsForAttachment> | undefined => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.attachments;
|
|
};
|
|
|
|
export const useMessageSenderIsAdmin = (messageId: string | undefined): boolean => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.isSenderAdmin || false;
|
|
};
|
|
|
|
export const useMessageIsDeletable = (messageId: string | undefined): boolean => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.isDeletable || false;
|
|
};
|
|
|
|
export const useMessageStatus = (
|
|
messageId: string | undefined
|
|
): LastMessageStatusType | undefined => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.status;
|
|
};
|
|
|
|
export function useMessageSender(messageId: string | undefined) {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.sender;
|
|
}
|
|
|
|
export function useMessageIsDeletableForEveryone(messageId: string | undefined) {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.isDeletableForEveryone;
|
|
}
|
|
|
|
export function useMessageServerTimestamp(messageId: string | undefined) {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.serverTimestamp;
|
|
}
|
|
|
|
export function useMessageReceivedAt(messageId: string | undefined) {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.receivedAt;
|
|
}
|
|
|
|
export function useMessageTimestamp(messageId: string | undefined) {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.timestamp;
|
|
}
|
|
|
|
export function useMessageBody(messageId: string) {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.text;
|
|
}
|
|
|
|
export const useMessageQuote = (messageId: string | undefined): PropsForQuote | undefined => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.quote;
|
|
};
|
|
|
|
export const useMessageHash = (messageId: string | undefined) => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.messageHash;
|
|
};
|
|
|
|
export const useMessageExpirationType = (messageId: string | undefined) => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.expirationType;
|
|
};
|
|
|
|
export const useMessageExpirationDurationMs = (messageId: string | undefined) => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.expirationDurationMs;
|
|
};
|
|
|
|
export const useMessageExpirationTimestamp = (messageId: string | undefined) => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.expirationTimestamp;
|
|
};
|
|
|
|
export const useMessageServerId = (messageId: string | undefined) => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.serverId;
|
|
};
|
|
|
|
export const useMessageText = (messageId: string | undefined): string | undefined => {
|
|
return useMessagePropsByMessageId(messageId)?.propsForMessage.text;
|
|
};
|
|
|
|
export function useHideAvatarInMsgList(messageId?: string) {
|
|
const msgProps = useMessagePropsByMessageId(messageId);
|
|
const selectedIsPrivate = useSelectedIsPrivate();
|
|
return msgProps?.propsForMessage.direction === 'outgoing' || selectedIsPrivate;
|
|
}
|
|
|
|
export function useMessageSelected(messageId?: string) {
|
|
return useSelector((state: StateType) => getIsMessageSelected(state, messageId));
|
|
}
|