From 54363e24a9a012ccf813b3932ff3a785ae44676e Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Wed, 26 Oct 2022 13:08:02 -0400 Subject: [PATCH] Add ability to update deletion duration --- app/soapbox/components/list.tsx | 22 +++++-- .../chat-page/components/chat-page-main.tsx | 48 ++++++++++++-- .../components/chat-widget/chat-settings.tsx | 42 ++++++++++-- .../components/chat-widget/chat-window.tsx | 12 +++- app/soapbox/queries/chats.ts | 65 ++++++++++++++++--- app/soapbox/utils/__tests__/numbers.test.tsx | 9 ++- app/soapbox/utils/numbers.tsx | 2 + 7 files changed, 174 insertions(+), 26 deletions(-) diff --git a/app/soapbox/components/list.tsx b/app/soapbox/components/list.tsx index b16a36784..2109aca66 100644 --- a/app/soapbox/components/list.tsx +++ b/app/soapbox/components/list.tsx @@ -14,16 +14,18 @@ const List: React.FC = ({ children }) => ( interface IListItem { label: React.ReactNode, hint?: React.ReactNode, - onClick?: () => void, + onClick?(): void, + onSelect?(): void + isSelected?: boolean } -const ListItem: React.FC = ({ label, hint, children, onClick }) => { +const ListItem: React.FC = ({ label, hint, children, onClick, onSelect, isSelected }) => { const id = uuidv4(); const domId = `list-group-${id}`; const Comp = onClick ? 'a' : 'div'; - const LabelComp = onClick ? 'span' : 'label'; - const linkProps = onClick ? { onClick } : {}; + const LabelComp = onClick || onSelect ? 'span' : 'label'; + const linkProps = onClick || onSelect ? { onClick: onClick || onSelect } : {}; const renderChildren = React.useCallback(() => { return React.Children.map(children, (child) => { @@ -46,7 +48,7 @@ const ListItem: React.FC = ({ label, hint, children, onClick }) => { @@ -65,6 +67,16 @@ const ListItem: React.FC = ({ label, hint, children, onClick }) => { ) : renderChildren()} + + {onSelect ? ( +
+ {children} + + {isSelected ? ( + + ) : null} +
+ ) : renderChildren()}
); }; diff --git a/app/soapbox/features/chats/components/chat-page/components/chat-page-main.tsx b/app/soapbox/features/chats/components/chat-page/components/chat-page-main.tsx index 505a4c1f3..2c7647663 100644 --- a/app/soapbox/features/chats/components/chat-page/components/chat-page-main.tsx +++ b/app/soapbox/features/chats/components/chat-page/components/chat-page-main.tsx @@ -3,11 +3,13 @@ import { defineMessages, useIntl } from 'react-intl'; import { blockAccount, unblockAccount } from 'soapbox/actions/accounts'; import { openModal } from 'soapbox/actions/modals'; -import { Avatar, Divider, HStack, Icon, IconButton, Menu, MenuButton, MenuItem, MenuList, Stack, Text } from 'soapbox/components/ui'; +import List, { ListItem } from 'soapbox/components/list'; +import { Avatar, HStack, Icon, IconButton, Menu, MenuButton, MenuItem, MenuList, Stack, Text } from 'soapbox/components/ui'; import VerificationBadge from 'soapbox/components/verification_badge'; import { useChatContext } from 'soapbox/contexts/chat-context'; import { useAppDispatch, useAppSelector, useOwnAccount } from 'soapbox/hooks'; -import { useChatActions } from 'soapbox/queries/chats'; +import { MessageExpirationValues, useChatActions } from 'soapbox/queries/chats'; +import { secondsToDays } from 'soapbox/utils/numbers'; import Chat from '../../chat'; @@ -28,6 +30,13 @@ const messages = defineMessages({ unblockUser: { id: 'chat_settings.options.unblock_user', defaultMessage: 'Unblock @{acct}' }, reportUser: { id: 'chat_settings.options.report_user', defaultMessage: 'Report @{acct}' }, leaveChat: { id: 'chat_settings.options.leave_chat', defaultMessage: 'Leave Chat' }, + autoDeleteLabel: { id: 'chat_settings.auto_delete.label', defaultMessage: 'Auto-delete messages' }, + autoDeleteHint: { id: 'chat_settings.auto_delete.hint', defaultMessage: 'Sent messages will auto-delete after the time period selected' }, + autoDelete7Days: { id: 'chat_settings.auto_delete.7days', defaultMessage: '7 days' }, + autoDelete14Days: { id: 'chat_settings.auto_delete.14days', defaultMessage: '14 days' }, + autoDelete30Days: { id: 'chat_settings.auto_delete.30days', defaultMessage: '30 days' }, + autoDelete90Days: { id: 'chat_settings.auto_delete.90days', defaultMessage: '90 days' }, + autoDeleteMessage: { id: 'chat_window.auto_delete_label', defaultMessage: 'Auto-delete after {day} days' }, }); const ChatPageMain = () => { @@ -38,7 +47,9 @@ const ChatPageMain = () => { const inputRef = useRef(null); const { chat, setChat } = useChatContext(); - const { deleteChat } = useChatActions(chat?.id as string); + const { deleteChat, updateChat } = useChatActions(chat?.id as string); + + const handleUpdateChat = (value: MessageExpirationValues) => updateChat.mutate({ message_expiration: value }); const isBlocking = useAppSelector((state) => state.getIn(['relationships', chat?.account?.id, 'blocking'])); @@ -106,11 +117,11 @@ const ChatPageMain = () => { align='left' size='sm' weight='medium' - theme='muted' + theme='primary' truncate className='w-full' > - {chat.account.acct} + {intl.formatMessage(messages.autoDeleteMessage, { day: secondsToDays(chat.message_expiration) })} @@ -133,7 +144,32 @@ const ChatPageMain = () => { - + + + handleUpdateChat(MessageExpirationValues.SEVEN)} + isSelected={chat.message_expiration === MessageExpirationValues.SEVEN} + /> + handleUpdateChat(MessageExpirationValues.FOURTEEN)} + isSelected={chat.message_expiration === MessageExpirationValues.FOURTEEN} + /> + handleUpdateChat(MessageExpirationValues.THIRTY)} + isSelected={chat.message_expiration === MessageExpirationValues.THIRTY} + /> + handleUpdateChat(MessageExpirationValues.NINETY)} + isSelected={chat.message_expiration === MessageExpirationValues.NINETY} + /> + { @@ -31,7 +38,9 @@ const ChatSettings = () => { const intl = useIntl(); const { chat, setEditing, toggleChatPane } = useChatContext(); - const { deleteChat } = useChatActions(chat?.id as string); + const { deleteChat, updateChat } = useChatActions(chat?.id as string); + + const handleUpdateChat = (value: MessageExpirationValues) => updateChat.mutate({ message_expiration: value }); const isBlocking = useAppSelector((state) => state.getIn(['relationships', chat?.account?.id, 'blocking'])); @@ -107,7 +116,32 @@ const ChatSettings = () => { - + + + handleUpdateChat(MessageExpirationValues.SEVEN)} + isSelected={chat.message_expiration === MessageExpirationValues.SEVEN} + /> + handleUpdateChat(MessageExpirationValues.FOURTEEN)} + isSelected={chat.message_expiration === MessageExpirationValues.FOURTEEN} + /> + handleUpdateChat(MessageExpirationValues.THIRTY)} + isSelected={chat.message_expiration === MessageExpirationValues.THIRTY} + /> + handleUpdateChat(MessageExpirationValues.NINETY)} + isSelected={chat.message_expiration === MessageExpirationValues.NINETY} + /> +