set a limit numer to pinned conversations

pull/1770/head
Brice-W 4 years ago
parent 4decda9cff
commit 4ddc00c9b6

@ -90,10 +90,13 @@ export class SessionInboxView extends React.Component<any, State> {
const fullFilledConversations = await Promise.all(filledConversations); const fullFilledConversations = await Promise.all(filledConversations);
const pinnedConversations = conversations.filter( (conversation) => conversation.isPinned).length;
const initialState: StateType = { const initialState: StateType = {
conversations: { conversations: {
conversationLookup: makeLookup(fullFilledConversations, 'id'), conversationLookup: makeLookup(fullFilledConversations, 'id'),
messages: [], messages: [],
pinnedConversations: pinnedConversations,
}, },
user: { user: {
ourNumber: UserUtils.getOurPubKeyStrFromCache(), ourNumber: UserUtils.getOurPubKeyStrFromCache(),

@ -1,5 +1,7 @@
import React from 'react'; import React from 'react';
import { getNumberOfPinnedConversations } from '../../../state/selectors/conversations';
import { conversationPinned, conversationUnpinned } from '../../../state/ducks/conversations';
import { NotificationForConvoOption, TimerOption } from '../../conversation/ConversationHeader'; import { NotificationForConvoOption, TimerOption } from '../../conversation/ConversationHeader';
import { Item, Submenu } from 'react-contexify'; import { Item, Submenu } from 'react-contexify';
import { ConversationNotificationSettingType } from '../../../models/conversation'; import { ConversationNotificationSettingType } from '../../../models/conversation';
@ -22,6 +24,9 @@ import {
unblockConvoById, unblockConvoById,
} from '../../../interactions/conversationInteractions'; } from '../../../interactions/conversationInteractions';
import { SessionButtonColor } from '../SessionButton'; import { SessionButtonColor } from '../SessionButton';
import { ToastUtils } from '../../../session/utils';
const maxNumberOfPinnedConversations = 5;
function showTimerOptions( function showTimerOptions(
isPublic: boolean, isPublic: boolean,
@ -132,10 +137,25 @@ export const MenuItemPinConversation = (
const { conversationId } = props; const { conversationId } = props;
const conversation = getConversationController().get(conversationId); const conversation = getConversationController().get(conversationId);
const isPinned = conversation.getIsPinned(); const isPinned = conversation.getIsPinned();
const dispatch = useDispatch();
const nbOfAlreadyPinnedConvos = useSelector(getNumberOfPinnedConversations);
const togglePinConversation = async () => { const togglePinConversation = async () => {
await conversation.setIsPinned(!isPinned); if (!isPinned && nbOfAlreadyPinnedConvos < maxNumberOfPinnedConversations) {
await conversation.setIsPinned(!isPinned);
dispatch(conversationPinned());
} else if (isPinned) {
await conversation.setIsPinned(!isPinned);
dispatch(conversationUnpinned());
} else {
ToastUtils.pushToastWarning(
'setPasswordSuccessToast',
window.i18n('removePasswordTitle'),
window.i18n('removePasswordToastDescription')
);
}
}; };
const menuText = isPinned ? window.i18n('unpinConversation') : window.i18n('pinConversation'); const menuText = isPinned ? window.i18n('unpinConversation') : window.i18n('pinConversation');
return <Item onClick={togglePinConversation}>{menuText}</Item>; return <Item onClick={togglePinConversation}>{menuText}</Item>;
}; };

@ -93,6 +93,7 @@ export type ConversationsStateType = {
conversationLookup: ConversationLookupType; conversationLookup: ConversationLookupType;
selectedConversation?: string; selectedConversation?: string;
messages: Array<MessageTypeInConvo>; messages: Array<MessageTypeInConvo>;
pinnedConversations: number;
}; };
async function getMessages( async function getMessages(
@ -243,6 +244,14 @@ export type SelectedConversationChangedActionType = {
messageId?: string; messageId?: string;
}; };
}; };
export type ConversationPinnedActionType = {
type: 'CONVERSATION_PINNED';
payload: null;
};
export type ConversationUnpinnedActionType = {
type: 'CONVERSATION_UNPINNED';
payload: null;
};
export type FetchMessagesForConversationType = { export type FetchMessagesForConversationType = {
type: 'messages/fetchByConversationKey/fulfilled'; type: 'messages/fetchByConversationKey/fulfilled';
@ -265,6 +274,8 @@ export type ConversationActionType =
| MessagesChangedActionType | MessagesChangedActionType
| SelectedConversationChangedActionType | SelectedConversationChangedActionType
| SelectedConversationChangedActionType | SelectedConversationChangedActionType
| ConversationPinnedActionType
| ConversationUnpinnedActionType
| FetchMessagesForConversationType; | FetchMessagesForConversationType;
// Action Creators // Action Creators
@ -282,6 +293,8 @@ export const actions = {
messagesChanged, messagesChanged,
fetchMessagesForConversation, fetchMessagesForConversation,
openConversationExternal, openConversationExternal,
conversationPinned,
conversationUnpinned,
}; };
function conversationAdded(id: string, data: ConversationType): ConversationAddedActionType { function conversationAdded(id: string, data: ConversationType): ConversationAddedActionType {
@ -406,6 +419,20 @@ export function openConversationExternal(
}; };
} }
export function conversationPinned(): ConversationPinnedActionType {
return {
type: 'CONVERSATION_PINNED',
payload: null,
};
}
export function conversationUnpinned(): ConversationUnpinnedActionType {
return {
type: 'CONVERSATION_UNPINNED',
payload: null,
};
}
// Reducer // Reducer
const toPickFromMessageModel = [ const toPickFromMessageModel = [
@ -437,6 +464,7 @@ function getEmptyState(): ConversationsStateType {
return { return {
conversationLookup: {}, conversationLookup: {},
messages: [], messages: [],
pinnedConversations: 0,
}; };
} }
@ -583,6 +611,30 @@ function handleConversationReset(
return state; return state;
} }
function handleConversationPinned(
state: ConversationsStateType,
action: ConversationPinnedActionType
) {
const { pinnedConversations } = state;
return {
...state,
pinnedConversations: pinnedConversations + 1,
};
}
function handleConversationUnpinned(
state: ConversationsStateType,
action: ConversationUnpinnedActionType
) {
const { pinnedConversations } = state;
return {
...state,
pinnedConversations: (pinnedConversations > 0) ? pinnedConversations - 1 : 0,
};
}
// tslint:disable: cyclomatic-complexity // tslint:disable: cyclomatic-complexity
// tslint:disable: max-func-body-length // tslint:disable: max-func-body-length
export function reducer( export function reducer(
@ -691,5 +743,13 @@ export function reducer(
return handleConversationReset(state, action); return handleConversationReset(state, action);
} }
if (action.type === 'CONVERSATION_PINNED') {
return handleConversationPinned(state, action);
}
if (action.type === 'CONVERSATION_UNPINNED') {
return handleConversationUnpinned(state, action);
}
return state; return state;
} }

@ -213,3 +213,7 @@ export const getMe = createSelector(
export const getUnreadMessageCount = createSelector(getLeftPaneLists, (state): number => { export const getUnreadMessageCount = createSelector(getLeftPaneLists, (state): number => {
return state.unreadCount; return state.unreadCount;
}); });
export const getNumberOfPinnedConversations = createSelector(getConversations, (state): number => {
return state.pinnedConversations;
});

Loading…
Cancel
Save