You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/components/settings/section/CategoryPrivacy.tsx

148 lines
5.7 KiB
TypeScript

/* eslint-disable @typescript-eslint/no-misused-promises */
import React from 'react';
import useUpdate from 'react-use/lib/useUpdate';
import { SettingsKey } from '../../../data/settings-key';
import { ConversationTypeEnum } from '../../../models/conversationAttributes';
import { updateConfirmModal } from '../../../state/ducks/modalDialog';
import { SessionButtonColor } from '../../basic/SessionButton';
import { SpacerLG } from '../../basic/Text';
import { TypingBubble } from '../../conversation/TypingBubble';
import { UserUtils } from '../../../session/utils';
import { ConfigurationSync } from '../../../session/utils/job_runners/jobs/ConfigurationSyncJob';
import { SessionUtilUserProfile } from '../../../session/utils/libsession/libsession_utils_user_profile';
import {
useHasBlindedMsgRequestsEnabled,
useHasLinkPreviewEnabled,
} from '../../../state/selectors/settings';
import { Storage } from '../../../util/storage';
import { SessionSettingButtonItem, SessionToggleWithDescription } from '../SessionSettingListItem';
import { displayPasswordModal } from '../SessionSettings';
async function toggleLinkPreviews(isToggleOn: boolean, forceUpdate: () => void) {
if (!isToggleOn) {
window.inboxStore?.dispatch(
updateConfirmModal({
title: window.i18n('linkPreviewsTitle'),
message: window.i18n('linkPreviewsConfirmMessage'),
okTheme: SessionButtonColor.Danger,
onClickOk: async () => {
const newValue = !isToggleOn;
await window.setSettingValue(SettingsKey.settingsLinkPreview, newValue);
forceUpdate();
},
onClickClose: () => {
window.inboxStore?.dispatch(updateConfirmModal(null));
},
})
);
} else {
await window.setSettingValue(SettingsKey.settingsLinkPreview, false);
await Storage.put(SettingsKey.hasLinkPreviewPopupBeenDisplayed, false);
forceUpdate();
}
}
const TypingBubbleItem = () => {
return (
<>
<SpacerLG />
<TypingBubble conversationType={ConversationTypeEnum.PRIVATE} isTyping={true} />
</>
);
};
export const SettingsCategoryPrivacy = (props: {
hasPassword: boolean | null;
onPasswordUpdated: (action: string) => void;
}) => {
const forceUpdate = useUpdate();
const isLinkPreviewsOn = useHasLinkPreviewEnabled();
const areBlindedRequestsEnabled = useHasBlindedMsgRequestsEnabled();
return (
<>
<SessionToggleWithDescription
onClickToggle={async () => {
const old = Boolean(window.getSettingValue(SettingsKey.settingsReadReceipt));
await window.setSettingValue(SettingsKey.settingsReadReceipt, !old);
forceUpdate();
}}
title={window.i18n('readReceiptSettingTitle')}
description={window.i18n('readReceiptSettingDescription')}
active={window.getSettingValue(SettingsKey.settingsReadReceipt)}
dataTestId="enable-read-receipts"
/>
<SessionToggleWithDescription
onClickToggle={async () => {
const old = Boolean(window.getSettingValue(SettingsKey.settingsTypingIndicator));
await window.setSettingValue(SettingsKey.settingsTypingIndicator, !old);
forceUpdate();
}}
title={window.i18n('typingIndicatorsSettingTitle')}
description={window.i18n('typingIndicatorsSettingDescription')}
active={Boolean(window.getSettingValue(SettingsKey.settingsTypingIndicator))}
childrenDescription={<TypingBubbleItem />}
/>
<SessionToggleWithDescription
onClickToggle={() => {
void toggleLinkPreviews(isLinkPreviewsOn, forceUpdate);
}}
title={window.i18n('linkPreviewsTitle')}
description={window.i18n('linkPreviewDescription')}
active={isLinkPreviewsOn}
/>
<SessionToggleWithDescription
onClickToggle={async () => {
const toggledValue = !areBlindedRequestsEnabled;
await window.setSettingValue(SettingsKey.hasBlindedMsgRequestsEnabled, toggledValue);
await SessionUtilUserProfile.insertUserProfileIntoWrapper(
UserUtils.getOurPubKeyStrFromCache()
);
await ConfigurationSync.queueNewJobIfNeeded();
forceUpdate();
}}
title={window.i18n('blindedMsgReqsSettingTitle')}
description={window.i18n('blindedMsgReqsSettingDesc')}
active={areBlindedRequestsEnabled}
/>
{!props.hasPassword ? (
<SessionSettingButtonItem
title={window.i18n('setAccountPasswordTitle')}
description={window.i18n('setAccountPasswordDescription')}
onClick={() => {
displayPasswordModal('set', props.onPasswordUpdated);
}}
buttonText={window.i18n('setPassword')}
dataTestId={'set-password-button'}
/>
) : (
<>
{/* We have a password, let's show the 'change' and 'remove' password buttons */}
<SessionSettingButtonItem
title={window.i18n('changeAccountPasswordTitle')}
description={window.i18n('changeAccountPasswordDescription')}
onClick={() => {
displayPasswordModal('change', props.onPasswordUpdated);
}}
buttonText={window.i18n('changePassword')}
dataTestId="change-password-settings-button"
/>
<SessionSettingButtonItem
title={window.i18n('removeAccountPasswordTitle')}
description={window.i18n('removeAccountPasswordDescription')}
onClick={() => {
displayPasswordModal('remove', props.onPasswordUpdated);
}}
buttonColor={SessionButtonColor.Danger}
buttonText={window.i18n('removePassword')}
dataTestId="remove-password-settings-button"
/>
</>
)}
</>
);
};