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() {