diff --git a/ts/components/menu/Menu.tsx b/ts/components/menu/Menu.tsx
index 6002ae14c..4bc44445c 100644
--- a/ts/components/menu/Menu.tsx
+++ b/ts/components/menu/Menu.tsx
@@ -12,6 +12,7 @@ import {
useIsMe,
useIsPrivate,
useIsPublic,
+ useIsRequest,
useNotificationSetting,
useWeAreAdmin,
} from '../../hooks/useParamSelector';
@@ -68,21 +69,27 @@ function showTimerOptions(
function showNotificationConvo(
isKickedFromGroup: boolean,
left: boolean,
- isBlocked: boolean
+ isBlocked: boolean,
+ isRequest: boolean
): boolean {
- return !left && !isKickedFromGroup && !isBlocked;
+ return !left && !isKickedFromGroup && !isBlocked && !isRequest;
}
-function showBlock(isMe: boolean, isPrivate: boolean): boolean {
- return !isMe && isPrivate;
+function showBlock(isMe: boolean, isPrivate: boolean, isRequest: boolean): boolean {
+ return !isMe && isPrivate && !isRequest;
}
-function showClearNickname(isMe: boolean, hasNickname: boolean, isPrivate: boolean): boolean {
- return !isMe && hasNickname && isPrivate;
+function showClearNickname(
+ isMe: boolean,
+ hasNickname: boolean,
+ isPrivate: boolean,
+ isRequest: boolean
+): boolean {
+ return !isMe && hasNickname && isPrivate && isRequest;
}
-function showChangeNickname(isMe: boolean, isPrivate: boolean) {
- return !isMe && isPrivate;
+function showChangeNickname(isMe: boolean, isPrivate: boolean, isRequest: boolean) {
+ return !isMe && isPrivate && !isRequest;
}
// we want to show the copyId for open groups and private chats only
@@ -94,10 +101,11 @@ function showDeleteContact(
isGroup: boolean,
isPublic: boolean,
isGroupLeft: boolean,
- isKickedFromGroup: boolean
+ isKickedFromGroup: boolean,
+ isRequest: boolean
): boolean {
// you need to have left a closed group first to be able to delete it completely.
- return !isGroup || (isGroup && (isGroupLeft || isKickedFromGroup || isPublic));
+ return (!isGroup && !isRequest) || (isGroup && (isGroupLeft || isKickedFromGroup || isPublic));
}
const showUnbanUser = (weAreAdmin: boolean, isPublic: boolean, isKickedFromGroup: boolean) => {
@@ -169,8 +177,9 @@ export const PinConversationMenuItem = (): JSX.Element | null => {
const conversationId = useContext(ContextConversationId);
const isMessagesSection = useSelector(getFocusedSection) === SectionType.Message;
const nbOfAlreadyPinnedConvos = useSelector(getNumberOfPinnedConversations);
+ const isRequest = useIsRequest(conversationId);
- if (isMessagesSection) {
+ if (isMessagesSection && !isRequest) {
const conversation = getConversationController().get(conversationId);
const isPinned = conversation?.isPinned() || false;
@@ -199,8 +208,9 @@ export const DeleteContactMenuItem = () => {
const isLeft = useIsLeft(convoId);
const isKickedFromGroup = useIsKickedFromGroup(convoId);
const isPrivate = useIsPrivate(convoId);
+ const isRequest = useIsRequest(convoId);
- if (showDeleteContact(!isPrivate, isPublic, isLeft, isKickedFromGroup)) {
+ if (showDeleteContact(!isPrivate, isPublic, isLeft, isKickedFromGroup, isRequest)) {
let menuItemText: string;
if (isPublic) {
menuItemText = window.i18n('leaveGroup');
@@ -448,9 +458,12 @@ export const NotificationForConvoMenuItem = (): JSX.Element | null => {
const left = useIsLeft(convoId);
const isBlocked = useIsBlocked(convoId);
const isPrivate = useIsPrivate(convoId);
+ const isRequest = useIsRequest(convoId);
const currentNotificationSetting = useNotificationSetting(convoId);
- if (showNotificationConvo(Boolean(isKickedFromGroup), Boolean(left), Boolean(isBlocked))) {
+ if (
+ showNotificationConvo(Boolean(isKickedFromGroup), Boolean(left), Boolean(isBlocked), isRequest)
+ ) {
// const isRtlMode = isRtlBody();'
// exclude mentions_only settings for private chats as this does not make much sense
@@ -503,8 +516,9 @@ export const BlockMenuItem = (): JSX.Element | null => {
const isMe = useIsMe(convoId);
const isBlocked = useIsBlocked(convoId);
const isPrivate = useIsPrivate(convoId);
+ const isRequest = useIsRequest(convoId);
- if (showBlock(Boolean(isMe), Boolean(isPrivate))) {
+ if (showBlock(Boolean(isMe), Boolean(isPrivate), Boolean(isRequest))) {
const blockTitle = isBlocked ? window.i18n('unblockUser') : window.i18n('blockUser');
const blockHandler = isBlocked
? () => unblockConvoById(convoId)
@@ -519,8 +533,9 @@ export const ClearNicknameMenuItem = (): JSX.Element | null => {
const isMe = useIsMe(convoId);
const hasNickname = useHasNickname(convoId);
const isPrivate = useIsPrivate(convoId);
+ const isRequest = Boolean(useIsRequest(convoId)); // easier to copy paste
- if (showClearNickname(Boolean(isMe), Boolean(hasNickname), Boolean(isPrivate))) {
+ if (showClearNickname(Boolean(isMe), Boolean(hasNickname), Boolean(isPrivate), isRequest)) {
return (
- clearNickNameByConvoId(convoId)}>{window.i18n('clearNickname')}
);
@@ -532,9 +547,10 @@ export const ChangeNicknameMenuItem = () => {
const convoId = useContext(ContextConversationId);
const isMe = useIsMe(convoId);
const isPrivate = useIsPrivate(convoId);
+ const isRequest = useIsRequest(convoId);
const dispatch = useDispatch();
- if (showChangeNickname(isMe, isPrivate)) {
+ if (showChangeNickname(isMe, isPrivate, isRequest)) {
return (
- {
@@ -550,6 +566,11 @@ export const ChangeNicknameMenuItem = () => {
export const DeleteMessagesMenuItem = () => {
const convoId = useContext(ContextConversationId);
+ const isRequest = useIsRequest(convoId);
+
+ if (isRequest) {
+ return null;
+ }
return (
- {
export const AcceptMenuItem = () => {
const convoId = useContext(ContextConversationId);
+ const isRequest = useIsRequest(convoId);
const convo = getConversationController().get(convoId);
- const showMenuItem = convo.isRequest();
- if (showMenuItem) {
+ if (isRequest) {
return (
- {
diff --git a/ts/hooks/useParamSelector.ts b/ts/hooks/useParamSelector.ts
index 3cff7c8a4..efe5e3246 100644
--- a/ts/hooks/useParamSelector.ts
+++ b/ts/hooks/useParamSelector.ts
@@ -1,4 +1,5 @@
import { useSelector } from 'react-redux';
+import { ConversationModel } from '../models/conversation';
import { PubKey } from '../session/types';
import { UserUtils } from '../session/utils';
import { StateType } from '../state/reducer';
@@ -118,6 +119,24 @@ export function useIsPinned(convoId?: string) {
return Boolean(convoProps && convoProps.isPinned);
}
+export function useIsApproved(convoId?: string) {
+ const convoProps = useConversationPropsById(convoId);
+ return Boolean(convoProps && convoProps.isApproved);
+}
+
+export function useIsRequest(convoId: string) {
+ const convoProps = useConversationPropsById(convoId);
+ return Boolean(
+ convoProps &&
+ ConversationModel.hasValidRequestValues({
+ isMe: convoProps.isMe,
+ isApproved: convoProps.isMe,
+ isPrivate: convoProps.isPrivate,
+ isBlocked: convoProps.isBlocked,
+ })
+ );
+}
+
export function useConversationPropsById(convoId?: string) {
return useSelector((state: StateType) => {
if (!convoId) {