feat: control available modes depending on the conversation

pull/2660/head
William Grant 2 years ago
parent 4731139b05
commit 8dc7dac55e

@ -12,11 +12,11 @@ import { PanelButtonGroup } from '../../../buttons';
import { PanelLabel } from '../../../buttons/PanelButton'; import { PanelLabel } from '../../../buttons/PanelButton';
import { PanelRadioButton } from '../../../buttons/PanelRadioButton'; import { PanelRadioButton } from '../../../buttons/PanelRadioButton';
import { SessionIconButton } from '../../../icon'; import { SessionIconButton } from '../../../icon';
import { getSelectedConversationExpirationSettings } from '../../../../state/selectors/conversations';
import { import {
DisappearingMessageConversationSetting, getSelectedConversationExpirationModes,
DisappearingMessageConversationType, getSelectedConversationExpirationSettings,
} from '../../../../util/expiringMessages'; } from '../../../../state/selectors/conversations';
import { DisappearingMessageConversationType } from '../../../../util/expiringMessages';
import { TimerOptionsArray } from '../../../../state/ducks/timerOptions'; import { TimerOptionsArray } from '../../../../state/ducks/timerOptions';
import { useTimerOptionsByMode } from '../../../../hooks/useParamSelector'; import { useTimerOptionsByMode } from '../../../../hooks/useParamSelector';
import { isEmpty } from 'lodash'; import { isEmpty } from 'lodash';
@ -177,7 +177,7 @@ const TimeOptions = (props: TimerOptionsProps) => {
export const OverlayDisappearingMessages = () => { export const OverlayDisappearingMessages = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const selectedConversationKey = useSelector(getSelectedConversationKey); const selectedConversationKey = useSelector(getSelectedConversationKey);
const disappearingModeOptions = DisappearingMessageConversationSetting; const disappearingModeOptions = useSelector(getSelectedConversationExpirationModes);
const convoProps = useSelector(getSelectedConversationExpirationSettings); const convoProps = useSelector(getSelectedConversationExpirationSettings);

@ -1045,18 +1045,16 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
} }
if (this.get('expireTimer') === expireTimer || (!expireTimer && !this.get('expireTimer'))) { if (this.get('expireTimer') === expireTimer || (!expireTimer && !this.get('expireTimer'))) {
return; window.log.info(`WIP: This disappearing message setting is invalid`, {
}
window?.log?.info('WIP: Updated conversation disappearing messages setting', {
id: this.idForLogging(), id: this.idForLogging(),
expirationType, expirationType,
expireTimer, expireTimer,
source, source,
}); });
return;
}
const isOutgoing = Boolean(!receivedAt); const isOutgoing = Boolean(!receivedAt);
source = source || UserUtils.getOurPubKeyStrFromCache(); source = source || UserUtils.getOurPubKeyStrFromCache();
// When we add a disappearing messages notification to the conversation, we want it // When we add a disappearing messages notification to the conversation, we want it
@ -1069,8 +1067,14 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
lastDisappearingMessageChangeTimestamp: providedChangeTimestamp || undefined, lastDisappearingMessageChangeTimestamp: providedChangeTimestamp || undefined,
}); });
const lastDisappearingMessageChangeTimestamp = providedChangeTimestamp || 0; window?.log?.info('WIP: Updated conversation disappearing messages setting', {
id: this.idForLogging(),
expirationType,
expireTimer,
source,
});
const lastDisappearingMessageChangeTimestamp = providedChangeTimestamp || 0;
const commonAttributes = { const commonAttributes = {
flags: SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE, flags: SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE,
expirationTimerUpdate: { expirationTimerUpdate: {
@ -1125,6 +1129,11 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
if (this.isMe()) { if (this.isMe()) {
// TODO Check that the args are correct // TODO Check that the args are correct
if (expireUpdate.expirationType === 'deleteAfterRead') {
window.log.info(`WIP: Note to Self messages cannot be delete after read!`);
return;
}
const expirationTimerMessage = new ExpirationTimerUpdateMessage(expireUpdate); const expirationTimerMessage = new ExpirationTimerUpdateMessage(expireUpdate);
return message.sendSyncMessageOnly(expirationTimerMessage); return message.sendSyncMessageOnly(expirationTimerMessage);
} }

@ -402,13 +402,14 @@ export async function innerHandleSwarmContentMessage(
perfStart(`handleSwarmDataMessage-${envelope.id}`); perfStart(`handleSwarmDataMessage-${envelope.id}`);
let expireUpdate = null;
const expirationType = DisappearingMessageConversationSetting[content.expirationType] || null; const expirationType = DisappearingMessageConversationSetting[content.expirationType] || null;
if (expirationType && content.expirationTimer) {
// NOTE In the protobuf this is a long // NOTE In the protobuf this is a long
const lastDisappearingMessageChangeTimestamp = const lastDisappearingMessageChangeTimestamp =
Number(content.lastDisappearingMessageChangeTimestamp) || null; Number(content.lastDisappearingMessageChangeTimestamp) || null;
let expireUpdate = null;
if (expirationType && content.expirationTimer) {
expireUpdate = { expireUpdate = {
expirationType, expirationType,
// TODO rename to expireTimer // TODO rename to expireTimer

@ -1,7 +1,7 @@
import { queueAttachmentDownloads } from './attachments'; import { queueAttachmentDownloads } from './attachments';
import { Quote } from './types'; import { Quote } from './types';
import _, { isEmpty } from 'lodash'; import _, { isEmpty, isEqual } from 'lodash';
import { getConversationController } from '../session/conversations'; import { getConversationController } from '../session/conversations';
import { ConversationModel } from '../models/conversation'; import { ConversationModel } from '../models/conversation';
import { MessageModel, sliceQuoteText } from '../models/message'; import { MessageModel, sliceQuoteText } from '../models/message';
@ -318,6 +318,12 @@ async function handleExpirationTimerUpdateNoCommit(
) { ) {
const providedChangeTimestamp = getNowWithNetworkOffset(); const providedChangeTimestamp = getNowWithNetworkOffset();
// TODO Not entirely sure that this works
if (conversation.get('lastDisappearingMessageChangeTimestamp') > providedChangeTimestamp) {
window.log.info(`WIP: This is an outdated disappearing message setting`);
return;
}
message.set({ message.set({
expirationTimerUpdate: { expirationTimerUpdate: {
source, source,
@ -366,9 +372,9 @@ export async function handleMessageJob(
const expireTimer = expireUpdate.expireTimer || oldExpireTimer; const expireTimer = expireUpdate.expireTimer || oldExpireTimer;
// TODO compare types and change timestamps // TODO compare types and change timestamps
// const oldTypeValue = conversation.get('expirationType'); const oldTypeValue = conversation.get('expirationType');
const oldTimerValue = conversation.get('expireTimer'); const oldTimerValue = conversation.get('expireTimer');
if (expireTimer === oldTimerValue) { if (isEqual(expirationType, oldTypeValue) && expireTimer === oldTimerValue) {
confirm?.(); confirm?.();
window?.log?.info( window?.log?.info(
'Dropping ExpireTimerUpdate message as we already have the same one set.' 'Dropping ExpireTimerUpdate message as we already have the same one set.'

@ -37,6 +37,7 @@ import { ConversationTypeEnum } from '../../models/conversationAttributes';
import { MessageReactsSelectorProps } from '../../components/conversation/message/message-content/MessageReactions'; import { MessageReactsSelectorProps } from '../../components/conversation/message/message-content/MessageReactions';
import { filter, isEmpty, pick, sortBy } from 'lodash'; import { filter, isEmpty, pick, sortBy } from 'lodash';
import { DisappearingMessageConversationSetting } from '../../util/expiringMessages';
export const getConversations = (state: StateType): ConversationsStateType => state.conversations; export const getConversations = (state: StateType): ConversationsStateType => state.conversations;
@ -1175,6 +1176,21 @@ export const getIsSelectedConvoInitialLoadingInProgress = createSelector(
(convo: ReduxConversationType | undefined): boolean => Boolean(convo?.isInitialFetchingInProgress) (convo: ReduxConversationType | undefined): boolean => Boolean(convo?.isInitialFetchingInProgress)
); );
export const getSelectedConversationExpirationModes = createSelector(
getSelectedConversation,
(convo: ReduxConversationType | undefined) => {
let modes = DisappearingMessageConversationSetting;
// Note to Self and Closed Groups only support deleteAfterSend
if (convo?.isMe || (convo?.isGroup && !convo.isPublic)) {
// only deleteAfterSend
modes = [modes[0], modes[2]];
}
return modes;
}
);
export const getSelectedConversationExpirationSettings = createSelector( export const getSelectedConversationExpirationSettings = createSelector(
getSelectedConversation, getSelectedConversation,
(convo: ReduxConversationType | undefined) => ({ (convo: ReduxConversationType | undefined) => ({

Loading…
Cancel
Save