From 904e93bd8e1088449d48885d9f302eba109c78c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Thu, 22 Sep 2022 22:00:32 +0200 Subject: [PATCH 01/19] Fix ReplyMentionsModal crash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- app/soapbox/features/compose/components/reply_mentions.tsx | 4 +++- app/soapbox/features/ui/components/reply_mentions_modal.tsx | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/soapbox/features/compose/components/reply_mentions.tsx b/app/soapbox/features/compose/components/reply_mentions.tsx index 577334281..865f6539d 100644 --- a/app/soapbox/features/compose/components/reply_mentions.tsx +++ b/app/soapbox/features/compose/components/reply_mentions.tsx @@ -36,7 +36,9 @@ const ReplyMentions: React.FC = ({ composeId }) => { const handleClick = (e: React.MouseEvent) => { e.preventDefault(); - dispatch(openModal('REPLY_MENTIONS')); + dispatch(openModal('REPLY_MENTIONS', { + composeId, + })); }; if (!parentTo || (parentTo.size === 0)) { diff --git a/app/soapbox/features/ui/components/reply_mentions_modal.tsx b/app/soapbox/features/ui/components/reply_mentions_modal.tsx index 43aaa24c4..2c8fc73b1 100644 --- a/app/soapbox/features/ui/components/reply_mentions_modal.tsx +++ b/app/soapbox/features/ui/components/reply_mentions_modal.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useCallback } from 'react'; import { FormattedMessage } from 'react-intl'; import { Modal } from 'soapbox/components/ui'; @@ -18,7 +18,8 @@ interface IReplyMentionsModal { const ReplyMentionsModal: React.FC = ({ composeId, onClose }) => { const compose = useCompose(composeId); - const status = useAppSelector(state => makeGetStatus()(state, { id: compose.in_reply_to! })); + const getStatus = useCallback(makeGetStatus(), []); + const status = useAppSelector(state => getStatus(state, { id: compose.in_reply_to! })); const account = useAppSelector((state) => state.accounts.get(state.me)); const mentions = statusToMentionsAccountIdsArray(status!, account!); From e8b547565ec9e467ea9c32c584c85c6be993b36c Mon Sep 17 00:00:00 2001 From: Justin Date: Fri, 23 Sep 2022 09:04:01 -0400 Subject: [PATCH 02/19] Add options to the ChatListItem --- .../chats/components/chat-list-item.tsx | 77 ++++++++++++++++++- .../chats/components/chat-pane/blankslate.tsx | 2 +- app/soapbox/queries/chats.ts | 2 + 3 files changed, 76 insertions(+), 5 deletions(-) diff --git a/app/soapbox/features/chats/components/chat-list-item.tsx b/app/soapbox/features/chats/components/chat-list-item.tsx index e600f9859..0453baaf8 100644 --- a/app/soapbox/features/chats/components/chat-list-item.tsx +++ b/app/soapbox/features/chats/components/chat-list-item.tsx @@ -1,10 +1,22 @@ -import React from 'react'; +import React, { useMemo } from 'react'; +import { defineMessages, useIntl } from 'react-intl'; +import { openModal } from 'soapbox/actions/modals'; import RelativeTimestamp from 'soapbox/components/relative-timestamp'; -import { Avatar, HStack, Icon, Stack, Text } from 'soapbox/components/ui'; +import { Avatar, HStack, Icon, IconButton, Stack, Text } from 'soapbox/components/ui'; import VerificationBadge from 'soapbox/components/verification_badge'; +import DropdownMenuContainer from 'soapbox/containers/dropdown_menu_container'; +import { useAppDispatch } from 'soapbox/hooks'; +import { IChat, IChatSilence, useChat, useChatSilence, useChatSilences } from 'soapbox/queries/chats'; -import type { IChat, IChatSilence } from 'soapbox/queries/chats'; +import type { Menu } from 'soapbox/components/dropdown_menu'; + +const messages = defineMessages({ + leaveMessage: { id: 'chat_settings.leave.message', defaultMessage: 'Are you sure you want to leave this chat? This conversation will be removed from your inbox.' }, + leaveHeading: { id: 'chat_settings.leave.heading', defaultMessage: 'Leave Chat' }, + leaveConfirm: { id: 'chat_settings.leave.confirm', defaultMessage: 'Leave Chat' }, + leaveChat: { id: 'chat_settings.options.leave_chat', defaultMessage: 'Leave Chat' }, +}); interface IChatListItemInterface { chat: IChat, @@ -13,12 +25,60 @@ interface IChatListItemInterface { } const ChatListItem: React.FC = ({ chat, chatSilence, onClick }) => { + const dispatch = useAppDispatch(); + const intl = useIntl(); + + const { handleSilence } = useChatSilence(chat); + const { deleteChat } = useChat(chat?.id as string); + + const menu = useMemo((): Menu => { + const menu: Menu = []; + + if (chatSilence) { + menu.push({ + text: 'Unsilence notifications', + action: (event) => { + event.stopPropagation(); + handleSilence(); + }, + icon: require('@tabler/icons/bell.svg'), + }); + } else { + menu.push({ + text: 'Silence notifications', + action: (event) => { + event.stopPropagation(); + handleSilence(); + }, + icon: require('@tabler/icons/bell-off.svg'), + }); + } + + menu.push({ + text: intl.formatMessage(messages.leaveChat), + action: (event) => { + event.stopPropagation(); + + dispatch(openModal('CONFIRM', { + heading: intl.formatMessage(messages.leaveHeading), + message: intl.formatMessage(messages.leaveMessage), + confirm: intl.formatMessage(messages.leaveConfirm), + confirmationTheme: 'primary', + onConfirm: () => deleteChat.mutate(), + })); + }, + icon: require('@tabler/icons/logout.svg'), + }); + + return menu; + }, [chatSilence]); + return (