Skip to content

Commit

Permalink
Add a modal dialogue to allow confirmation when marking all convos read.
Browse files Browse the repository at this point in the history
  • Loading branch information
ianmacd committed Feb 23, 2023
1 parent f915896 commit 542b512
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 9 deletions.
53 changes: 53 additions & 0 deletions ts/components/dialog/MarkAllAsReadDialog.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import React, { useState } from 'react';
import { SpacerLG } from '../basic/Text';
import { getConversationController } from '../../session/conversations';
import { markAllAsReadModal } from '../../state/ducks/modalDialog';
import { SessionButton, SessionButtonType } from '../basic/SessionButton';
import { SessionWrapperModal } from '../SessionWrapperModal';
import { ToastUtils } from '../../session/utils';

export const MarkAllAsReadDialog = () => {
const titleText = window.i18n('markAllAsRead');
const okText = window.i18n('markAllAsRead');
const cancelText = window.i18n('cancel');
const [_isLoading, setIsLoading] = useState(false);

const onClickOK = async () => {
setIsLoading(true);

const controller = getConversationController();
const convos = controller.getConversations().filter(conversation => {
return conversation.isApproved();
});
for (const convo of convos) {
await controller.get(convo.id).markAllAsRead();
}
ToastUtils.pushToastSuccess( 'allMarkedRead', window.i18n('allMarkedAsRead'));

setIsLoading(false);
closeDialog();
};

const closeDialog = () => {
window.inboxStore?.dispatch(markAllAsReadModal(null));
};

return (
<SessionWrapperModal title={titleText} onClose={closeDialog}>
<SpacerLG />

<div className="session-modal__button-group">
<SessionButton
text={okText}
buttonType={SessionButtonType.Simple}
onClick={onClickOK}
/>
<SessionButton
text={cancelText}
buttonType={SessionButtonType.Simple}
onClick={closeDialog}
/>
</div>
</SessionWrapperModal>
);
};
4 changes: 4 additions & 0 deletions ts/components/dialog/ModalContainer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
getDeleteAccountModalState,
getEditProfileDialog,
getInviteContactModal,
getMarkAllAsReadDialog,
getOnionPathDialog,
getReactClearAllDialog,
getReactListDialog,
Expand Down Expand Up @@ -36,6 +37,7 @@ import { SessionNicknameDialog } from './SessionNicknameDialog';
import { BanOrUnBanUserDialog } from './BanOrUnbanUserDialog';
import { ReactListModal } from './ReactListModal';
import { ReactClearAllModal } from './ReactClearAllModal';
import { MarkAllAsReadDialog } from './MarkAllAsReadDialog';

export const ModalContainer = () => {
const confirmModalState = useSelector(getConfirmModal);
Expand All @@ -55,6 +57,7 @@ export const ModalContainer = () => {
const banOrUnbanUserModalState = useSelector(getBanOrUnbanUserModalState);
const reactListModalState = useSelector(getReactListDialog);
const reactClearAllModalState = useSelector(getReactClearAllDialog);
const markAllAsReadModalState = useSelector(getMarkAllAsReadDialog);

return (
<>
Expand All @@ -79,6 +82,7 @@ export const ModalContainer = () => {
{confirmModalState && <SessionConfirm {...confirmModalState} />}
{reactListModalState && <ReactListModal {...reactListModalState} />}
{reactClearAllModalState && <ReactClearAllModal {...reactClearAllModalState} />}
{markAllAsReadModalState && <MarkAllAsReadDialog {...markAllAsReadModalState} />}
</>
);
};
14 changes: 5 additions & 9 deletions ts/components/leftpane/ActionsPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,10 @@ import { cleanUpOldDecryptedMedias } from '../../session/crypto/DecryptedAttachm

import { DURATION } from '../../session/constants';

import { editProfileModal, onionPathModal } from '../../state/ducks/modalDialog';
import { editProfileModal,
markAllAsReadModal,
onionPathModal
} from '../../state/ducks/modalDialog';
import { uploadOurAvatar } from '../../interactions/conversationInteractions';
import { debounce, isEmpty, isString } from 'lodash';

Expand Down Expand Up @@ -79,14 +82,7 @@ const Section = (props: { type: SectionType }) => {
// Show Path Indicator Modal
dispatch(onionPathModal({}));
} else if (type === SectionType.MarkAllAsRead) {
const controller = getConversationController();
const convos = controller.getConversations().filter(conversation => {
return conversation.isApproved();
});
for (const convo of convos) {
await controller.get(convo.id).markAllAsRead();
}
ToastUtils.pushToastSuccess('allMarkedRead', window.i18n('allMarkedAsRead'));
dispatch(markAllAsReadModal({}));
} else {
// message section
dispatch(clearSearch());
Expand Down
7 changes: 7 additions & 0 deletions ts/state/ducks/modalDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export type EditProfileModalState = {} | null;
export type OnionPathModalState = EditProfileModalState;
export type RecoveryPhraseModalState = EditProfileModalState;
export type DeleteAccountModalState = EditProfileModalState;
export type MarkAllAsReadModalState = EditProfileModalState;

export type SessionPasswordModalState = { passwordAction: PasswordAction; onOk: () => void } | null;

Expand Down Expand Up @@ -50,6 +51,7 @@ export type ModalState = {
adminLeaveClosedGroup: AdminLeaveClosedGroupModalState;
sessionPasswordModal: SessionPasswordModalState;
deleteAccountModal: DeleteAccountModalState;
markAllAsReadModal: MarkAllAsReadModalState;
reactListModalState: ReactModalsState;
reactClearAllModalState: ReactModalsState;
};
Expand All @@ -70,6 +72,7 @@ export const initialModalState: ModalState = {
adminLeaveClosedGroup: null,
sessionPasswordModal: null,
deleteAccountModal: null,
markAllAsReadModal: null,
reactListModalState: null,
reactClearAllModalState: null,
};
Expand Down Expand Up @@ -123,6 +126,9 @@ const ModalSlice = createSlice({
updateDeleteAccountModal(state, action: PayloadAction<DeleteAccountModalState>) {
return { ...state, deleteAccountModal: action.payload };
},
markAllAsReadModal(state, action: PayloadAction<MarkAllAsReadModalState>) {
return { ...state, markAllAsReadModal: action.payload };
},
updateReactListModal(state, action: PayloadAction<ReactModalsState>) {
return { ...state, reactListModalState: action.payload };
},
Expand All @@ -147,6 +153,7 @@ export const {
recoveryPhraseModal,
adminLeaveClosedGroup,
sessionPassword,
markAllAsReadModal,
updateDeleteAccountModal,
updateBanOrUnbanUserModal,
updateReactListModal,
Expand Down
5 changes: 5 additions & 0 deletions ts/state/selectors/modal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
DeleteAccountModalState,
EditProfileModalState,
InviteContactModalState,
MarkAllAsReadModalState,
ModalState,
OnionPathModalState,
ReactModalsState,
Expand Down Expand Up @@ -109,3 +110,7 @@ export const getReactClearAllDialog = createSelector(
getModal,
(state: ModalState): ReactModalsState => state.reactClearAllModalState
);

export const getMarkAllAsReadDialog = createSelector(
getModal,
(state: ModalState): MarkAllAsReadModalState => state.markAllAsReadModal);

0 comments on commit 542b512

Please sign in to comment.