diff --git a/ts/components/conversation/TimerNotification.tsx b/ts/components/conversation/TimerNotification.tsx index 7e5150cd7..4ed9b45bf 100644 --- a/ts/components/conversation/TimerNotification.tsx +++ b/ts/components/conversation/TimerNotification.tsx @@ -11,13 +11,15 @@ import { useSelectedConversationDisappearingMode, useSelectedConversationKey, useSelectedExpireTimer, + useSelectedIsGroupOrCommunity, + useSelectedIsGroupV2, useSelectedIsNoteToSelf, useSelectedIsPrivate, useSelectedIsPrivateFriend, } from '../../state/selectors/selectedConversation'; import { ReleasedFeatures } from '../../util/releaseFeature'; import { Flex } from '../basic/Flex'; -import { TextWithChildren } from '../basic/Text'; +import { SpacerMD, TextWithChildren } from '../basic/Text'; import { ExpirableReadableMessage } from './message/message-item/ExpirableReadableMessage'; // eslint-disable-next-line import/order import { ConversationInteraction } from '../../interactions'; @@ -25,6 +27,7 @@ import { getConversationController } from '../../session/conversations'; import { updateConfirmModal } from '../../state/ducks/modalDialog'; import { SessionButtonColor } from '../basic/SessionButton'; import { SessionHtmlRenderer } from '../basic/SessionHTMLRenderer'; +import { SessionIcon } from '../icon'; const FollowSettingButton = styled.button` color: var(--primary-color); @@ -182,6 +185,9 @@ export const TimerNotification = (props: PropsForExpirationTimer) => { const { messageId } = props; const textToRender = useTextToRender(props); + const isGroupOrCommunity = useSelectedIsGroupOrCommunity(); + const isGroupV2 = useSelectedIsGroupV2(); + const renderOffIcon = props.disabled || (isGroupOrCommunity && !isGroupV2); if (!textToRender || textToRender.length === 0) { throw new Error('textToRender invalid key used TimerNotification'); @@ -205,6 +211,16 @@ export const TimerNotification = (props: PropsForExpirationTimer) => { padding="5px 10px" style={{ textAlign: 'center' }} > + {renderOffIcon && ( + <> + + + + )} diff --git a/ts/components/conversation/header/ConversationHeaderSubtitle.tsx b/ts/components/conversation/header/ConversationHeaderSubtitle.tsx index b12e13bd6..a4b9e7229 100644 --- a/ts/components/conversation/header/ConversationHeaderSubtitle.tsx +++ b/ts/components/conversation/header/ConversationHeaderSubtitle.tsx @@ -123,7 +123,7 @@ export const ConversationHeaderSubtitle = (props: ConversationHeaderSubtitleProp )} diff --git a/ts/components/conversation/header/ConversationHeaderTitle.tsx b/ts/components/conversation/header/ConversationHeaderTitle.tsx index d496b846a..43830a101 100644 --- a/ts/components/conversation/header/ConversationHeaderTitle.tsx +++ b/ts/components/conversation/header/ConversationHeaderTitle.tsx @@ -8,7 +8,7 @@ import { resetRightOverlayMode, setRightOverlayMode } from '../../../state/ducks import { useSelectedConversationDisappearingMode, useSelectedConversationKey, - useSelectedIsGroup, + useSelectedIsGroupOrCommunity, useSelectedIsKickedFromGroup, useSelectedIsNoteToSelf, useSelectedIsPublic, @@ -42,7 +42,7 @@ export const ConversationHeaderTitle = () => { const isPublic = useSelectedIsPublic(); const isKickedFromGroup = useSelectedIsKickedFromGroup(); const isMe = useSelectedIsNoteToSelf(); - const isGroup = useSelectedIsGroup(); + const isGroup = useSelectedIsGroupOrCommunity(); const members = useSelectedMembers(); const expirationMode = useSelectedConversationDisappearingMode(); diff --git a/ts/components/conversation/message/message-content/MessageAuthorText.tsx b/ts/components/conversation/message/message-content/MessageAuthorText.tsx index 1f9aecc68..4aedcaeb1 100644 --- a/ts/components/conversation/message/message-content/MessageAuthorText.tsx +++ b/ts/components/conversation/message/message-content/MessageAuthorText.tsx @@ -10,7 +10,7 @@ import { useMessageDirection, } from '../../../../state/selectors'; import { - useSelectedIsGroup, + useSelectedIsGroupOrCommunity, useSelectedIsPublic, } from '../../../../state/selectors/selectedConversation'; import { Flex } from '../../../basic/Flex'; @@ -28,7 +28,7 @@ const StyledAuthorContainer = styled(Flex)<{ hideAvatar: boolean }>` export const MessageAuthorText = (props: Props) => { const isPublic = useSelectedIsPublic(); - const isGroup = useSelectedIsGroup(); + const isGroup = useSelectedIsGroupOrCommunity(); const authorProfileName = useAuthorProfileName(props.messageId); const authorName = useAuthorName(props.messageId); const sender = useMessageAuthor(props.messageId); diff --git a/ts/components/conversation/message/message-content/MessageReactBar.tsx b/ts/components/conversation/message/message-content/MessageReactBar.tsx index 2d7d0cad6..1be31cc7a 100644 --- a/ts/components/conversation/message/message-content/MessageReactBar.tsx +++ b/ts/components/conversation/message/message-content/MessageReactBar.tsx @@ -151,7 +151,7 @@ const ExpiresInItem = ({ expirationTimestamp }: { expirationTimestamp?: number | return ( - + {formatTimeLeft({ timeLeftMs })} diff --git a/ts/components/conversation/message/message-content/MessageReactions.tsx b/ts/components/conversation/message/message-content/MessageReactions.tsx index 223c55188..0ce6a4fa1 100644 --- a/ts/components/conversation/message/message-content/MessageReactions.tsx +++ b/ts/components/conversation/message/message-content/MessageReactions.tsx @@ -4,7 +4,7 @@ import styled from 'styled-components'; import { useMessageReactsPropsById } from '../../../../hooks/useParamSelector'; import { MessageRenderingProps } from '../../../../models/messageType'; import { REACT_LIMIT } from '../../../../session/constants'; -import { useSelectedIsGroup } from '../../../../state/selectors/selectedConversation'; +import { useSelectedIsGroupOrCommunity } from '../../../../state/selectors/selectedConversation'; import { SortedReactionList } from '../../../../types/Reaction'; import { nativeEmojiData } from '../../../../util/emoji'; import { Flex } from '../../../basic/Flex'; @@ -175,7 +175,7 @@ export const MessageReactions = (props: Props) => { const msgProps = useMessageReactsPropsById(messageId); - const inGroup = useSelectedIsGroup(); + const inGroup = useSelectedIsGroupOrCommunity(); useEffect(() => { if (msgProps?.sortedReacts && !isEqual(reactions, msgProps?.sortedReacts)) { diff --git a/ts/components/conversation/message/message-content/MessageStatus.tsx b/ts/components/conversation/message/message-content/MessageStatus.tsx index 41b9386fb..d28a41ef7 100644 --- a/ts/components/conversation/message/message-content/MessageStatus.tsx +++ b/ts/components/conversation/message/message-content/MessageStatus.tsx @@ -6,7 +6,7 @@ import { useMessageExpirationPropsById } from '../../../../hooks/useParamSelecto import { useMessageStatus } from '../../../../state/selectors'; import { getMostRecentMessageId } from '../../../../state/selectors/conversations'; -import { useSelectedIsGroup } from '../../../../state/selectors/selectedConversation'; +import { useSelectedIsGroupOrCommunity } from '../../../../state/selectors/selectedConversation'; import { SpacerXS } from '../../../basic/Text'; import { SessionIcon, SessionIconType } from '../../../icon'; import { ExpireTimer } from '../../ExpireTimer'; @@ -179,7 +179,7 @@ function IconForExpiringMessageId({ const MessageStatusSent = ({ dataTestId, messageId }: Omit) => { const isExpiring = useIsExpiring(messageId); const isMostRecentMessage = useIsMostRecentMessage(messageId); - const isGroup = useSelectedIsGroup(); + const isGroup = useSelectedIsGroupOrCommunity(); // we hide a "sent" message status which is not expiring except for the most recent message if (!isExpiring && !isMostRecentMessage) { @@ -204,7 +204,7 @@ const MessageStatusRead = ({ isIncoming, }: Omit & { isIncoming: boolean }) => { const isExpiring = useIsExpiring(messageId); - const isGroup = useSelectedIsGroup(); + const isGroup = useSelectedIsGroupOrCommunity(); const isMostRecentMessage = useIsMostRecentMessage(messageId); @@ -231,7 +231,7 @@ const MessageStatusError = ({ dataTestId }: Omit) => { ipcRenderer.send('show-debug-log'); }, []); // when on error, we do not display the expire timer at all. - const isGroup = useSelectedIsGroup(); + const isGroup = useSelectedIsGroupOrCommunity(); return ( ` display: -webkit-box; @@ -61,7 +61,7 @@ export const QuoteText = ( ) => { const { text, attachment, isIncoming, referencedMessageNotFound } = props; - const isGroup = useSelectedIsGroup(); + const isGroup = useSelectedIsGroupOrCommunity(); if (!referencedMessageNotFound && attachment && !isEmpty(attachment)) { const { contentType, isVoiceMessage } = attachment; diff --git a/ts/components/conversation/right-panel/overlay/OverlayRightPanelSettings.tsx b/ts/components/conversation/right-panel/overlay/OverlayRightPanelSettings.tsx index cab16bfee..29c72d811 100644 --- a/ts/components/conversation/right-panel/overlay/OverlayRightPanelSettings.tsx +++ b/ts/components/conversation/right-panel/overlay/OverlayRightPanelSettings.tsx @@ -30,7 +30,7 @@ import { useSelectedDisplayNameInProfile, useSelectedIsActive, useSelectedIsBlocked, - useSelectedIsGroup, + useSelectedIsGroupOrCommunity, useSelectedIsKickedFromGroup, useSelectedIsLeft, useSelectedIsPublic, @@ -128,7 +128,7 @@ const HeaderItem = () => { const isBlocked = useSelectedIsBlocked(); const isKickedFromGroup = useSelectedIsKickedFromGroup(); const left = useSelectedIsLeft(); - const isGroup = useSelectedIsGroup(); + const isGroup = useSelectedIsGroupOrCommunity(); const subscriberCount = useSelectedSubscriberCount(); if (!selectedConvoKey) { @@ -201,7 +201,7 @@ export const OverlayRightPanelSettings = () => { const isBlocked = useSelectedIsBlocked(); const isKickedFromGroup = useSelectedIsKickedFromGroup(); const left = useSelectedIsLeft(); - const isGroup = useSelectedIsGroup(); + const isGroup = useSelectedIsGroupOrCommunity(); const isPublic = useSelectedIsPublic(); const weAreAdmin = useSelectedWeAreAdmin(); const disappearingMessagesSubtitle = useDisappearingMessageSettingText({ diff --git a/ts/components/conversation/right-panel/overlay/disappearing-messages/OverlayDisappearingMessages.tsx b/ts/components/conversation/right-panel/overlay/disappearing-messages/OverlayDisappearingMessages.tsx index 8c50402d7..c4486540f 100644 --- a/ts/components/conversation/right-panel/overlay/disappearing-messages/OverlayDisappearingMessages.tsx +++ b/ts/components/conversation/right-panel/overlay/disappearing-messages/OverlayDisappearingMessages.tsx @@ -12,8 +12,8 @@ import { useSelectedConversationDisappearingMode, useSelectedConversationKey, useSelectedExpireTimer, - useSelectedIsGroup, - useSelectedWeAreAdmin, + useSelectedIsGroupOrCommunity, + useSelectedWeAreAdmin } from '../../../../../state/selectors/selectedConversation'; import { ReleasedFeatures } from '../../../../../util/releaseFeature'; import { Flex } from '../../../../basic/Flex'; @@ -114,7 +114,7 @@ export const OverlayDisappearingMessages = () => { const disappearingModeOptions = useSelector(getSelectedConversationExpirationModes); const { singleMode, hasOnlyOneMode } = useSingleMode(disappearingModeOptions); - const isGroup = useSelectedIsGroup(); + const isGroup = useSelectedIsGroupOrCommunity(); const expirationMode = useSelectedConversationDisappearingMode(); const expireTimer = useSelectedExpireTimer(); const weAreAdmin = useSelectedWeAreAdmin(); diff --git a/ts/components/dialog/SessionConfirm.tsx b/ts/components/dialog/SessionConfirm.tsx index 550c8439e..27b5f691e 100644 --- a/ts/components/dialog/SessionConfirm.tsx +++ b/ts/components/dialog/SessionConfirm.tsx @@ -49,7 +49,7 @@ export interface SessionConfirmDialogProps { */ onClickOk?: (...args: Array) => Promise | void; - onClickClose: () => any; + onClickClose?: () => any; /** * function to run on close click. Closes modal after execution by default @@ -140,8 +140,8 @@ export const SessionConfirm = (props: SessionConfirmDialogProps) => { */ const onClickCancelHandler = () => { onClickCancel?.(); - onClickClose?.(); + window.inboxStore?.dispatch(updateConfirmModal(null)); }; return ( diff --git a/ts/components/icon/Icons.tsx b/ts/components/icon/Icons.tsx index 78967591e..36a9c7ebb 100644 --- a/ts/components/icon/Icons.tsx +++ b/ts/components/icon/Icons.tsx @@ -62,7 +62,6 @@ export type SessionIconType = | 'shield' | 'star' | 'sun' - | 'stopwatch' | 'qr' | 'users' | 'warning' @@ -71,6 +70,7 @@ export type SessionIconType = | 'gallery' | 'stop' | 'thumbnail' + | 'timerFixed' | 'timer00' | 'timer05' | 'timer10' @@ -450,12 +450,6 @@ export const icons: Record { +const getSelectedConversationType = (state: StateType): ConversationTypeEnum | null => { + const selected = getSelectedConversation(state); + if (!selected || !selected.type) { + return null; + } + return selected.type; +}; + +const getSelectedConversationIsGroupOrCommunity = (state: StateType): boolean => { + const type = getSelectedConversationType(state); + return type ? isOpenOrClosedGroup(type) : false; +}; + +const getSelectedConversationIsGroupV2 = (state: StateType): boolean => { const selected = getSelectedConversation(state); if (!selected || !selected.type) { return false; } - return selected.type ? isOpenOrClosedGroup(selected.type) : false; + return selected.type === ConversationTypeEnum.GROUPV3; }; /** @@ -232,8 +241,12 @@ export function useSelectedConversationKey() { return useSelector(getSelectedConversationKey); } -export function useSelectedIsGroup() { - return useSelector(getSelectedConversationIsGroup); +export function useSelectedIsGroupOrCommunity() { + return useSelector(getSelectedConversationIsGroupOrCommunity); +} + +export function useSelectedIsGroupV2() { + return useSelector(getSelectedConversationIsGroupV2); } export function useSelectedIsPublic() {