element has a child
element that allows keyboard interaction */
+ /* tslint:disable-next-line: react-a11y-event-has-role */
+
+
+ {mode === 'qr' && }
+ {mode === 'default' && (
+ <>
+
+
+
{updatedProfileName || profileName}
+
{
+ setMode('edit');
+ }}
+ dataTestId="edit-profile-icon"
+ />
+
+ >
+ )}
+ {mode === 'edit' && (
+ <>
+
+
+
+
+ >
+ )}
-async function commitProfileEdits(newName: string, scaledAvatarUrl: string | null) {
- const ourNumber = UserUtils.getOurPubKeyStrFromCache();
- const conversation = await getConversationController().getOrCreateAndWait(
- ourNumber,
- ConversationTypeEnum.PRIVATE
- );
+
+
+
- if (scaledAvatarUrl?.length) {
- try {
- const blobContent = await (await fetch(scaledAvatarUrl)).blob();
- if (!blobContent || !blobContent.size) {
- throw new Error('Failed to fetch blob content from scaled avatar');
- }
- await uploadOurAvatar(await blobContent.arrayBuffer());
- } catch (error) {
- if (error.message && error.message.length) {
- ToastUtils.pushToastError('edit-profile', error.message);
- }
- window.log.error(
- 'showEditProfileDialog Error ensuring that image is properly sized:',
- error && error.stack ? error.stack : error
- );
- }
- return;
- }
- // do not update the avatar if it did not change
- conversation.setSessionDisplayNameNoCommit(newName);
+
- // might be good to not trigger a sync if the name did not change
- await conversation.commit();
- await setLastProfileUpdateTimestamp(Date.now());
- await SyncUtils.forceSyncConfigurationNowIfNeeded(true);
-}
+ {mode === 'default' || mode === 'qr' ? (
+ {
+ window.clipboard.writeText(ourId);
+ ToastUtils.pushCopiedToClipBoard();
+ }}
+ dataTestId="copy-button-profile-update"
+ />
+ ) : (
+ !loading && (
+
+ )
+ )}
+
+
+
+ );
+};
diff --git a/ts/components/dialog/EditProfilePictureModal.tsx b/ts/components/dialog/EditProfilePictureModal.tsx
new file mode 100644
index 000000000..2554c420f
--- /dev/null
+++ b/ts/components/dialog/EditProfilePictureModal.tsx
@@ -0,0 +1,164 @@
+import React, { useState } from 'react';
+import { useDispatch } from 'react-redux';
+import styled from 'styled-components';
+import { clearOurAvatar, uploadOurAvatar } from '../../interactions/conversationInteractions';
+import { ToastUtils } from '../../session/utils';
+import { editProfileModal, updateEditProfilePictureModel } from '../../state/ducks/modalDialog';
+import { pickFileForAvatar } from '../../types/attachments/VisualAttachment';
+import { SessionWrapperModal } from '../SessionWrapperModal';
+import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
+import { SessionSpinner } from '../basic/SessionSpinner';
+import { SpacerLG } from '../basic/Text';
+import { SessionIconButton } from '../icon';
+import { ProfileAvatar } from './EditProfileDialog';
+
+const StyledAvatarContainer = styled.div`
+ cursor: pointer;
+`;
+const UploadImageButton = () => {
+ return (
+
+ );
+};
+
+const uploadProfileAvatar = async (scaledAvatarUrl: string | null) => {
+ if (scaledAvatarUrl?.length) {
+ try {
+ const blobContent = await (await fetch(scaledAvatarUrl)).blob();
+ if (!blobContent || !blobContent.size) {
+ throw new Error('Failed to fetch blob content from scaled avatar');
+ }
+ await uploadOurAvatar(await blobContent.arrayBuffer());
+ } catch (error) {
+ if (error.message && error.message.length) {
+ ToastUtils.pushToastError('edit-profile', error.message);
+ }
+ window.log.error(
+ 'showEditProfileDialog Error ensuring that image is properly sized:',
+ error && error.stack ? error.stack : error
+ );
+ }
+ }
+};
+
+export type EditProfilePictureModalProps = {
+ avatarPath: string | null;
+ profileName: string | undefined;
+ ourId: string;
+};
+
+export const EditProfilePictureModal = (props: EditProfilePictureModalProps) => {
+ const dispatch = useDispatch();
+
+ const [newAvatarObjectUrl, setNewAvatarObjectUrl] = useState
(props.avatarPath);
+ const [loading, setLoading] = useState(false);
+
+ if (!props) {
+ return null;
+ }
+
+ const { avatarPath, profileName, ourId } = props;
+
+ const closeDialog = () => {
+ dispatch(updateEditProfilePictureModel(null));
+ dispatch(editProfileModal({}));
+ };
+
+ const handleAvatarClick = async () => {
+ const updatedAvatarObjectUrl = await pickFileForAvatar();
+ if (updatedAvatarObjectUrl) {
+ setNewAvatarObjectUrl(updatedAvatarObjectUrl);
+ }
+ };
+
+ const handleUpload = async () => {
+ setLoading(true);
+ if (newAvatarObjectUrl === avatarPath) {
+ window.log.debug('Avatar Object URL has not changed!');
+ return;
+ }
+
+ await uploadProfileAvatar(newAvatarObjectUrl);
+ setLoading(false);
+ dispatch(updateEditProfilePictureModel(null));
+ };
+
+ const handleRemove = async () => {
+ setLoading(true);
+ await clearOurAvatar();
+ setNewAvatarObjectUrl(null);
+ setLoading(false);
+ dispatch(updateEditProfilePictureModel(null));
+ };
+
+ return (
+
+ void handleAvatarClick()}
+ data-testid={'image-upload-click'}
+ >
+
+ {newAvatarObjectUrl || avatarPath ? (
+
+ ) : (
+
+ )}
+
+
+
+ {loading ? (
+
+ ) : (
+ <>
+
+
+
+
+
+ >
+ )}
+
+ );
+};
diff --git a/ts/components/dialog/ModalContainer.tsx b/ts/components/dialog/ModalContainer.tsx
index d54bbe7e8..9a0d7b6b7 100644
--- a/ts/components/dialog/ModalContainer.tsx
+++ b/ts/components/dialog/ModalContainer.tsx
@@ -8,6 +8,7 @@ import {
getConfirmModal,
getDeleteAccountModalState,
getEditProfileDialog,
+ getEditProfilePictureModalState,
getInviteContactModal,
getOnionPathDialog,
getReactClearAllDialog,
@@ -36,6 +37,7 @@ import { SessionNicknameDialog } from './SessionNicknameDialog';
import { BanOrUnBanUserDialog } from './BanOrUnbanUserDialog';
import { ReactListModal } from './ReactListModal';
import { ReactClearAllModal } from './ReactClearAllModal';
+import { EditProfilePictureModal } from './EditProfilePictureModal';
export const ModalContainer = () => {
const confirmModalState = useSelector(getConfirmModal);
@@ -55,6 +57,7 @@ export const ModalContainer = () => {
const banOrUnbanUserModalState = useSelector(getBanOrUnbanUserModalState);
const reactListModalState = useSelector(getReactListDialog);
const reactClearAllModalState = useSelector(getReactClearAllDialog);
+ const editProfilePictureModalState = useSelector(getEditProfilePictureModalState);
return (
<>
@@ -79,6 +82,9 @@ export const ModalContainer = () => {
{confirmModalState && }
{reactListModalState && }
{reactClearAllModalState && }
+ {editProfilePictureModalState && (
+
+ )}
>
);
};
diff --git a/ts/components/icon/Icons.tsx b/ts/components/icon/Icons.tsx
index 9be3ed3bd..2f74e9b94 100644
--- a/ts/components/icon/Icons.tsx
+++ b/ts/components/icon/Icons.tsx
@@ -66,6 +66,7 @@ export type SessionIconType =
| 'doubleCheckCircle'
| 'gallery'
| 'stop'
+ | 'thumbnail'
| 'timer00'
| 'timer05'
| 'timer10'
@@ -83,7 +84,7 @@ export type SessionIconType =
export type SessionIconSize = 'tiny' | 'small' | 'medium' | 'large' | 'huge' | 'huge2' | 'max';
-export const icons = {
+export const icons: Record = {
addUser: {
path:
'M8.85,2.17c-1.73,0-3.12,1.4-3.12,3.12s1.4,3.12,3.12,3.12c1.73,0,3.13-1.4,3.13-3.12S10.58,2.17,8.85,2.17z M8.85,0.08c2.88,0,5.21,2.33,5.21,5.21s-2.33,5.21-5.21,5.21s-5.2-2.33-5.2-5.21C3.65,2.42,5.98,0.08,8.85,0.08z M20.83,5.29 c0.54,0,0.98,0.41,1.04,0.93l0.01,0.11v2.08h2.08c0.54,0,0.98,0.41,1.04,0.93v0.12c0,0.54-0.41,0.98-0.93,1.04l-0.11,0.01h-2.08 v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08h-2.08c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11 c0-0.54,0.41-0.98,0.93-1.04l0.11-0.01h2.08V6.34C19.79,5.76,20.26,5.29,20.83,5.29z M12.5,12.58c2.8,0,5.09,2.21,5.2,4.99v0.22 v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08c0-1.67-1.3-3.03-2.95-3.12h-0.18H5.21 c-1.67,0-3.03,1.3-3.12,2.95v0.18v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93L0,19.88V17.8 c0-2.8,2.21-5.09,4.99-5.2h0.22h7.29V12.58z',
@@ -475,6 +476,12 @@ export const icons = {
viewBox: '-1 -1 35 35',
ratio: 1,
},
+ thumbnail: {
+ path:
+ 'm34.915 23.899-8.321-6.087a.308.308 0 0 0-.385 0l-7.461 6.177a.334.334 0 0 1-.398 0l-3.75-3.057a.308.308 0 0 0-.372 0L4.07 28.15a.335.335 0 0 0-.129.257v2.337a.745.745 0 0 0 .732.732h29.638a.732.732 0 0 0 .731-.732v-6.6a.281.281 0 0 0-.128-.244Zm-23.82-5.15a2.89 2.89 0 1 0 0-5.778 2.89 2.89 0 0 0 0 5.778ZM40.36 4.624 8.193.874a3.197 3.197 0 0 0-3.57 2.838L4.469 5.1h2.568l.128-1.091a.63.63 0 0 1 .244-.424.642.642 0 0 1 .386-.141h.064L22.15 5.099h13.534a5.137 5.137 0 0 1 4.071 2.042h.308a.642.642 0 0 1 .565.706l-.09.732a5.14 5.14 0 0 1 .283 1.605v18.312L43.185 8.18a3.223 3.223 0 0 0-2.825-3.557Zm-4.675 30.678H3.3a3.21 3.21 0 0 1-3.21-3.21v-21.83a3.21 3.21 0 0 1 3.21-3.21h32.385a3.21 3.21 0 0 1 3.21 3.21v21.83a3.21 3.21 0 0 1-3.21 3.21ZM3.3 9.594a.642.642 0 0 0-.642.642v21.83a.642.642 0 0 0 .642.642h32.385a.642.642 0 0 0 .643-.642v-21.83a.642.642 0 0 0-.643-.642H3.3Z',
+ viewBox: '0 0 44 36',
+ ratio: 1,
+ },
timer00: {
path:
'M11.428367,3.44328115 L10.5587469,3.94535651 C10.4906607,3.79477198 10.4145019,3.64614153 10.330127,3.5 C10.2457522,3.35385847 10.1551138,3.21358774 10.0587469,3.07933111 L10.928367,2.57725574 C11.0225793,2.71323387 11.1119641,2.85418158 11.1961524,3 C11.2803407,3.14581842 11.3577126,3.2937018 11.428367,3.44328115 Z M9.42274426,1.07163304 L8.92066889,1.94125309 C8.78641226,1.84488615 8.64614153,1.75424783 8.5,1.66987298 C8.35385847,1.58549813 8.20522802,1.50933927 8.05464349,1.44125309 L8.55671885,0.571633044 C8.7062982,0.642287382 8.85418158,0.719659271 9,0.803847577 C9.14581842,0.888035884 9.28676613,0.977420696 9.42274426,1.07163304 Z M11.9794631,6.5 L10.9753124,6.5 C10.9916403,6.33554688 11,6.1687497 11,6 C11,5.8312503 10.9916403,5.66445312 10.9753124,5.5 L11.9794631,5.5 C11.9930643,5.66486669 12,5.83162339 12,6 C12,6.16837661 11.9930643,6.33513331 11.9794631,6.5 Z M10.928367,9.42274426 L10.0587469,8.92066889 C10.1551138,8.78641226 10.2457522,8.64614153 10.330127,8.5 C10.4145019,8.35385847 10.4906607,8.20522802 10.5587469,8.05464349 L11.428367,8.55671885 C11.3577126,8.7062982 11.2803407,8.85418158 11.1961524,9 C11.1119641,9.14581842 11.0225793,9.28676613 10.928367,9.42274426 Z M8.55671885,11.428367 L8.05464349,10.5587469 C8.20522802,10.4906607 8.35385847,10.4145019 8.5,10.330127 C8.64614153,10.2457522 8.78641226,10.1551138 8.92066889,10.0587469 L9.42274426,10.928367 C9.28676613,11.0225793 9.14581842,11.1119641 9,11.1961524 C8.85418158,11.2803407 8.7062982,11.3577126 8.55671885,11.428367 Z M2.57725574,10.928367 L3.07933111,10.0587469 C3.21358774,10.1551138 3.35385847,10.2457522 3.5,10.330127 C3.64614153,10.4145019 3.79477198,10.4906607 3.94535651,10.5587469 L3.44328115,11.428367 C3.2937018,11.3577126 3.14581842,11.2803407 3,11.1961524 C2.85418158,11.1119641 2.71323387,11.0225793 2.57725574,10.928367 Z M5.5,11.9794631 L5.5,10.9753124 C5.66445312,10.9916403 5.8312503,11 6,11 C6.1687497,11 6.33554688,10.9916403 6.5,10.9753124 L6.5,11.9794631 C6.33513331,11.9930643 6.16837661,12 6,12 C5.83162339,12 5.66486669,11.9930643 5.5,11.9794631 Z M0.571633044,8.55671885 L1.44125309,8.05464349 C1.50933927,8.20522802 1.58549813,8.35385847 1.66987298,8.5 C1.75424783,8.64614153 1.84488615,8.78641226 1.94125309,8.92066889 L1.07163304,9.42274426 C0.977420696,9.28676613 0.888035884,9.14581842 0.803847577,9 C0.719659271,8.85418158 0.642287382,8.7062982 0.571633044,8.55671885 Z M0.0205368885,5.5 L1.02468762,5.5 C1.00835972,5.66445312 1,5.8312503 1,6 C1,6.1687497 1.00835972,6.33554688 1.02468762,6.5 L0.0205368885,6.5 C0.00693566443,6.33513331 -9.95062878e-13,6.16837661 -9.95093808e-13,6 C-9.95124738e-13,5.83162339 0.00693566443,5.66486669 0.0205368885,5.5 Z M1.07163304,2.57725574 L1.94125309,3.07933111 C1.84488615,3.21358774 1.75424783,3.35385847 1.66987298,3.5 C1.58549813,3.64614153 1.50933927,3.79477198 1.44125309,3.94535651 L0.571633044,3.44328115 C0.642287382,3.2937018 0.719659271,3.14581842 0.803847577,3 C0.888035884,2.85418158 0.977420696,2.71323387 1.07163304,2.57725574 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z M6.5,0.0205368885 L6.5,7 L5.5,7 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,5.01e-14 6,5.01e-14 C6.16837661,5.01e-14 6.33513331,0.00693566443 6.5,0.0205368885 Z',
@@ -536,10 +543,8 @@ export const icons = {
ratio: 1,
},
timer50: {
- path: [
- 'M8.49999998,1.66987313 L8.99999998,0.80384773 C10.3298113,1.57161469 11.3667294,2.84668755 11.7955548,4.4470858 C12.6532057,7.64788242 10.7537107,10.9379042 7.5529141,11.795555 C4.35211748,12.6532059 1.06209574,10.753711 0.204444873,7.55291434 C-0.27253249,5.77281059 0.103264647,3.96510985 1.08141192,2.56355986 L1.94944135,3.0683506 L1.94144625,3.07944279 L6.25000012,5.56698754 L5.75000012,6.43301294 L1.44144624,3.9454682 C0.98322086,4.96059039 0.85962347,6.13437085 1.1703707,7.29409529 C1.88507976,9.96142581 4.62676454,11.5443383 7.29409506,10.8296292 C9.96142557,10.1149201 11.544338,7.37323536 10.829629,4.70590484 C10.4722744,3.37223964 9.60817605,2.30967894 8.49999998,1.66987313 Z',
- 'M6.00250506,1.00000061 L6,1 C5.8312503,1 5.66445312,1.00835972 5.5,1.02468762 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,0 6,0 L6.00250686,5.12480482e-07 C9.31506271,0.0013544265 12,2.68712686 12,6 L11,6 C11,3.23941132 8.76277746,1.00135396 6.00250506,1.00000061 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z',
- ],
+ path:
+ 'M8.49999998,1.66987313 L8.99999998,0.80384773 C10.3298113,1.57161469 11.3667294,2.84668755 11.7955548,4.4470858 C12.6532057,7.64788242 10.7537107,10.9379042 7.5529141,11.795555 C4.35211748,12.6532059 1.06209574,10.753711 0.204444873,7.55291434 C-0.27253249,5.77281059 0.103264647,3.96510985 1.08141192,2.56355986 L1.94944135,3.0683506 L1.94144625,3.07944279 L6.25000012,5.56698754 L5.75000012,6.43301294 L1.44144624,3.9454682 C0.98322086,4.96059039 0.85962347,6.13437085 1.1703707,7.29409529 C1.88507976,9.96142581 4.62676454,11.5443383 7.29409506,10.8296292 C9.96142557,10.1149201 11.544338,7.37323536 10.829629,4.70590484 C10.4722744,3.37223964 9.60817605,2.30967894 8.49999998,1.66987313 Z M6.00250506,1.00000061 L6,1 C5.8312503,1 5.66445312,1.00835972 5.5,1.02468762 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,0 6,0 L6.00250686,5.12480482e-07 C9.31506271,0.0013544265 12,2.68712686 12,6 L11,6 C11,3.23941132 8.76277746,1.00135396 6.00250506,1.00000061 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z',
viewBox: '0 0 12 12',
ratio: 1,
},
diff --git a/ts/interactions/conversationInteractions.ts b/ts/interactions/conversationInteractions.ts
index 8ded7592b..6d4f6b60f 100644
--- a/ts/interactions/conversationInteractions.ts
+++ b/ts/interactions/conversationInteractions.ts
@@ -1,3 +1,4 @@
+import { isNil } from 'lodash';
import {
ConversationNotificationSettingType,
ConversationTypeEnum,
@@ -487,6 +488,37 @@ export async function uploadOurAvatar(newAvatarDecrypted?: ArrayBuffer) {
};
}
+/**
+ * This function can be used for clearing our avatar.
+ */
+export async function clearOurAvatar(commit: boolean = true) {
+ const ourConvo = getConversationController().get(UserUtils.getOurPubKeyStrFromCache());
+ if (!ourConvo) {
+ window.log.warn('ourConvo not found... This is not a valid case');
+ return;
+ }
+
+ // return early if no change are needed at all
+ if (
+ isNil(ourConvo.get('avatarPointer')) &&
+ isNil(ourConvo.get('avatarInProfile')) &&
+ isNil(ourConvo.get('profileKey'))
+ ) {
+ return;
+ }
+
+ ourConvo.set('avatarPointer', undefined);
+ ourConvo.set('avatarInProfile', undefined);
+ ourConvo.set('profileKey', undefined);
+
+ await setLastProfileUpdateTimestamp(Date.now());
+
+ if (commit) {
+ await ourConvo.commit();
+ await SyncUtils.forceSyncConfigurationNowIfNeeded(true);
+ }
+}
+
export async function replyToMessage(messageId: string) {
const quotedMessageModel = await Data.getMessageById(messageId);
if (!quotedMessageModel) {
diff --git a/ts/state/ducks/modalDialog.tsx b/ts/state/ducks/modalDialog.tsx
index be1cb8b92..128606d87 100644
--- a/ts/state/ducks/modalDialog.tsx
+++ b/ts/state/ducks/modalDialog.tsx
@@ -1,6 +1,7 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { SessionConfirmDialogProps } from '../../components/dialog/SessionConfirm';
import { PasswordAction } from '../../components/dialog/SessionPasswordDialog';
+import { EditProfilePictureModalProps } from '../../components/dialog/EditProfilePictureModal';
import { Noop } from '../../types/Util';
export type BanType = 'ban' | 'unban';
@@ -36,6 +37,8 @@ export type ReactModalsState = {
messageId: string;
} | null;
+export type EditProfilePictureModalState = EditProfilePictureModalProps | null;
+
export type ModalState = {
confirmModal: ConfirmModalState;
inviteContactModal: InviteContactModalState;
@@ -54,6 +57,7 @@ export type ModalState = {
deleteAccountModal: DeleteAccountModalState;
reactListModalState: ReactModalsState;
reactClearAllModalState: ReactModalsState;
+ editProfilePictureModalState: EditProfilePictureModalState;
};
export const initialModalState: ModalState = {
@@ -74,6 +78,7 @@ export const initialModalState: ModalState = {
deleteAccountModal: null,
reactListModalState: null,
reactClearAllModalState: null,
+ editProfilePictureModalState: null,
};
const ModalSlice = createSlice({
@@ -131,6 +136,9 @@ const ModalSlice = createSlice({
updateReactClearAllModal(state, action: PayloadAction) {
return { ...state, reactClearAllModalState: action.payload };
},
+ updateEditProfilePictureModel(state, action: PayloadAction) {
+ return { ...state, editProfilePictureModalState: action.payload };
+ },
},
});
@@ -153,5 +161,6 @@ export const {
updateBanOrUnbanUserModal,
updateReactListModal,
updateReactClearAllModal,
+ updateEditProfilePictureModel,
} = actions;
export const modalReducer = reducer;
diff --git a/ts/state/selectors/modal.ts b/ts/state/selectors/modal.ts
index f959bc243..259aad8b5 100644
--- a/ts/state/selectors/modal.ts
+++ b/ts/state/selectors/modal.ts
@@ -9,6 +9,7 @@ import {
ConfirmModalState,
DeleteAccountModalState,
EditProfileModalState,
+ EditProfilePictureModalState,
InviteContactModalState,
ModalState,
OnionPathModalState,
@@ -109,3 +110,8 @@ export const getReactClearAllDialog = createSelector(
getModal,
(state: ModalState): ReactModalsState => state.reactClearAllModalState
);
+
+export const getEditProfilePictureModalState = createSelector(
+ getModal,
+ (state: ModalState): EditProfilePictureModalState => state.editProfilePictureModalState
+);
diff --git a/ts/types/LocalizerKeys.ts b/ts/types/LocalizerKeys.ts
index 592b1f592..ed5d4ad7f 100644
--- a/ts/types/LocalizerKeys.ts
+++ b/ts/types/LocalizerKeys.ts
@@ -1,512 +1,513 @@
export type LocalizerKeys =
- | 'copyErrorAndQuit'
- | 'unknown'
- | 'databaseError'
- | 'mainMenuFile'
- | 'mainMenuEdit'
- | 'mainMenuView'
- | 'mainMenuWindow'
- | 'mainMenuHelp'
+ | 'ByUsingThisService...'
+ | 'about'
+ | 'accept'
+ | 'activeMembers'
+ | 'add'
+ | 'addACaption'
+ | 'addAsModerator'
+ | 'addModerators'
+ | 'addingContacts'
+ | 'allUsersAreRandomly...'
+ | 'anonymous'
+ | 'answeredACall'
| 'appMenuHide'
| 'appMenuHideOthers'
- | 'appMenuUnhide'
| 'appMenuQuit'
- | 'editMenuUndo'
- | 'editMenuRedo'
- | 'editMenuCut'
- | 'editMenuCopy'
- | 'editMenuPaste'
- | 'editMenuDeleteContact'
- | 'editMenuDeleteGroup'
- | 'editMenuSelectAll'
- | 'windowMenuClose'
- | 'windowMenuMinimize'
- | 'windowMenuZoom'
- | 'viewMenuResetZoom'
- | 'viewMenuZoomIn'
- | 'viewMenuZoomOut'
- | 'viewMenuToggleFullScreen'
- | 'viewMenuToggleDevTools'
- | 'contextMenuNoSuggestions'
- | 'openGroupInvitation'
- | 'joinOpenGroupAfterInvitationConfirmationTitle'
- | 'joinOpenGroupAfterInvitationConfirmationDesc'
- | 'couldntFindServerMatching'
- | 'enterSessionIDOrONSName'
- | 'startNewConversationBy...'
- | 'loading'
- | 'done'
- | 'youLeftTheGroup'
- | 'youGotKickedFromGroup'
- | 'unreadMessages'
- | 'debugLogExplanation'
- | 'reportIssue'
- | 'markAllAsRead'
- | 'incomingError'
- | 'media'
- | 'mediaEmptyState'
- | 'document'
- | 'documents'
- | 'documentsEmptyState'
- | 'today'
- | 'yesterday'
- | 'thisWeek'
- | 'thisMonth'
- | 'voiceMessage'
- | 'stagedPreviewThumbnail'
- | 'previewThumbnail'
- | 'stagedImageAttachment'
- | 'oneNonImageAtATimeToast'
- | 'cannotMixImageAndNonImageAttachments'
- | 'maximumAttachments'
- | 'fileSizeWarning'
- | 'unableToLoadAttachment'
- | 'offline'
- | 'debugLog'
- | 'showDebugLog'
- | 'shareBugDetails'
- | 'goToReleaseNotes'
- | 'goToSupportPage'
- | 'about'
- | 'show'
- | 'sessionMessenger'
- | 'noSearchResults'
- | 'conversationsHeader'
- | 'contactsHeader'
- | 'messagesHeader'
- | 'searchMessagesHeader'
- | 'settingsHeader'
- | 'typingAlt'
- | 'contactAvatarAlt'
- | 'downloadAttachment'
- | 'replyToMessage'
- | 'replyingToMessage'
- | 'originalMessageNotFound'
- | 'you'
- | 'audioPermissionNeededTitle'
- | 'audioPermissionNeeded'
- | 'image'
+ | 'appMenuUnhide'
+ | 'appearanceSettingsTitle'
+ | 'areYouSureClearDevice'
+ | 'areYouSureDeleteDeviceOnly'
+ | 'areYouSureDeleteEntireAccount'
| 'audio'
- | 'video'
- | 'photo'
+ | 'audioMessageAutoplayDescription'
+ | 'audioMessageAutoplayTitle'
+ | 'audioNotificationsSettingsTitle'
+ | 'audioPermissionNeeded'
+ | 'audioPermissionNeededTitle'
+ | 'autoUpdateDownloadButtonLabel'
+ | 'autoUpdateDownloadInstructions'
+ | 'autoUpdateDownloadedMessage'
+ | 'autoUpdateLaterButtonLabel'
+ | 'autoUpdateNewVersionInstructions'
+ | 'autoUpdateNewVersionMessage'
+ | 'autoUpdateNewVersionTitle'
+ | 'autoUpdateRestartButtonLabel'
+ | 'autoUpdateSettingDescription'
+ | 'autoUpdateSettingTitle'
+ | 'banUser'
+ | 'banUserAndDeleteAll'
+ | 'beginYourSession'
+ | 'blindedMsgReqsSettingDesc'
+ | 'blindedMsgReqsSettingTitle'
+ | 'block'
+ | 'blocked'
+ | 'blockedSettingsTitle'
+ | 'callMediaPermissionsDescription'
+ | 'callMediaPermissionsDialogContent'
+ | 'callMediaPermissionsDialogTitle'
+ | 'callMediaPermissionsTitle'
+ | 'callMissed'
+ | 'callMissedCausePermission'
+ | 'callMissedNotApproved'
+ | 'callMissedTitle'
+ | 'cameraPermissionNeeded'
+ | 'cameraPermissionNeededTitle'
+ | 'cancel'
+ | 'cannotMixImageAndNonImageAttachments'
+ | 'cannotRemoveCreatorFromGroup'
+ | 'cannotRemoveCreatorFromGroupDesc'
| 'cannotUpdate'
| 'cannotUpdateDetail'
- | 'ok'
- | 'cancel'
+ | 'changeAccountPasswordDescription'
+ | 'changeAccountPasswordTitle'
+ | 'changeNickname'
+ | 'changeNicknameMessage'
+ | 'changePassword'
+ | 'changePasswordInvalid'
+ | 'changePasswordTitle'
+ | 'changePasswordToastDescription'
+ | 'chooseAnAction'
+ | 'classicDarkThemeTitle'
+ | 'classicLightThemeTitle'
+ | 'clear'
+ | 'clearAll'
+ | 'clearAllConfirmationBody'
+ | 'clearAllConfirmationTitle'
+ | 'clearAllData'
+ | 'clearAllReactions'
+ | 'clearDataSettingsTitle'
+ | 'clearDevice'
+ | 'clearNickname'
+ | 'clickToTrustContact'
| 'close'
+ | 'closedGroupInviteFailMessage'
+ | 'closedGroupInviteFailMessagePlural'
+ | 'closedGroupInviteFailTitle'
+ | 'closedGroupInviteFailTitlePlural'
+ | 'closedGroupInviteOkText'
+ | 'closedGroupInviteSuccessMessage'
+ | 'closedGroupInviteSuccessTitle'
+ | 'closedGroupInviteSuccessTitlePlural'
+ | 'closedGroupMaxSize'
+ | 'confirmNewPassword'
+ | 'confirmPassword'
+ | 'connectToServerFail'
+ | 'connectToServerSuccess'
+ | 'connectingToServer'
+ | 'contactAvatarAlt'
+ | 'contactsHeader'
+ | 'contextMenuNoSuggestions'
| 'continue'
- | 'error'
+ | 'continueYourSession'
+ | 'conversationsHeader'
+ | 'conversationsSettingsTitle'
+ | 'copiedToClipboard'
+ | 'copyErrorAndQuit'
+ | 'copyMessage'
+ | 'copyOpenGroupURL'
+ | 'copySessionID'
+ | 'couldntFindServerMatching'
+ | 'create'
+ | 'createAccount'
+ | 'createClosedGroupNamePrompt'
+ | 'createClosedGroupPlaceholder'
+ | 'createConversationNewContact'
+ | 'createConversationNewGroup'
+ | 'createGroup'
+ | 'createPassword'
+ | 'createSessionID'
+ | 'databaseError'
+ | 'debugLog'
+ | 'debugLogExplanation'
+ | 'decline'
+ | 'declineRequestMessage'
| 'delete'
- | 'messageDeletionForbidden'
- | 'deleteJustForMe'
+ | 'deleteAccountFromLogin'
+ | 'deleteAccountWarning'
+ | 'deleteContactConfirmation'
+ | 'deleteConversation'
+ | 'deleteConversationConfirmation'
| 'deleteForEveryone'
- | 'deleteMessagesQuestion'
+ | 'deleteJustForMe'
| 'deleteMessageQuestion'
| 'deleteMessages'
- | 'deleteConversation'
+ | 'deleteMessagesQuestion'
| 'deleted'
- | 'messageDeletedPlaceholder'
- | 'from'
- | 'to'
- | 'sent'
- | 'received'
- | 'sendMessage'
- | 'groupMembers'
- | 'moreInformation'
- | 'resend'
- | 'deleteConversationConfirmation'
- | 'clear'
- | 'clearAllData'
- | 'deleteAccountWarning'
- | 'deleteAccountFromLogin'
- | 'deleteContactConfirmation'
- | 'quoteThumbnailAlt'
- | 'imageAttachmentAlt'
- | 'videoAttachmentAlt'
- | 'lightboxImageAlt'
- | 'imageCaptionIconAlt'
- | 'addACaption'
- | 'copySessionID'
- | 'copyOpenGroupURL'
- | 'save'
- | 'saveLogToDesktop'
- | 'saved'
- | 'tookAScreenshot'
- | 'savedTheFile'
- | 'linkPreviewsTitle'
- | 'linkPreviewDescription'
- | 'linkPreviewsConfirmMessage'
- | 'mediaPermissionsTitle'
- | 'mediaPermissionsDescription'
- | 'spellCheckTitle'
- | 'spellCheckDescription'
- | 'spellCheckDirty'
- | 'readReceiptSettingDescription'
- | 'readReceiptSettingTitle'
- | 'typingIndicatorsSettingDescription'
- | 'typingIndicatorsSettingTitle'
- | 'zoomFactorSettingTitle'
- | 'themesSettingTitle'
- | 'primaryColor'
- | 'primaryColorGreen'
- | 'primaryColorBlue'
- | 'primaryColorYellow'
- | 'primaryColorPink'
- | 'primaryColorPurple'
- | 'primaryColorOrange'
- | 'primaryColorRed'
- | 'classicDarkThemeTitle'
- | 'classicLightThemeTitle'
- | 'oceanDarkThemeTitle'
- | 'oceanLightThemeTitle'
- | 'pruneSettingTitle'
- | 'pruneSettingDescription'
- | 'enable'
- | 'keepDisabled'
- | 'notificationSettingsDialog'
- | 'nameAndMessage'
- | 'noNameOrMessage'
- | 'nameOnly'
- | 'newMessage'
- | 'createConversationNewContact'
- | 'createConversationNewGroup'
- | 'joinACommunity'
- | 'chooseAnAction'
- | 'newMessages'
- | 'notificationMostRecentFrom'
- | 'notificationFrom'
- | 'notificationMostRecent'
- | 'sendFailed'
- | 'mediaMessage'
- | 'messageBodyMissing'
- | 'messageBody'
- | 'unblockToSend'
- | 'youChangedTheTimer'
- | 'timerSetOnSync'
- | 'theyChangedTheTimer'
- | 'timerOption_0_seconds'
- | 'timerOption_5_seconds'
- | 'timerOption_10_seconds'
- | 'timerOption_30_seconds'
- | 'timerOption_1_minute'
- | 'timerOption_5_minutes'
- | 'timerOption_30_minutes'
- | 'timerOption_1_hour'
- | 'timerOption_6_hours'
- | 'timerOption_12_hours'
- | 'timerOption_1_day'
- | 'timerOption_1_week'
- | 'timerOption_2_weeks'
+ | 'destination'
+ | 'device'
+ | 'deviceOnly'
+ | 'dialogClearAllDataDeletionFailedDesc'
+ | 'dialogClearAllDataDeletionFailedMultiple'
+ | 'dialogClearAllDataDeletionFailedTitle'
+ | 'dialogClearAllDataDeletionFailedTitleQuestion'
+ | 'dialogClearAllDataDeletionQuestion'
+ | 'disabledDisappearingMessages'
| 'disappearingMessages'
- | 'changeNickname'
- | 'clearNickname'
- | 'nicknamePlaceholder'
- | 'changeNicknameMessage'
- | 'timerOption_0_seconds_abbreviated'
- | 'timerOption_5_seconds_abbreviated'
- | 'timerOption_10_seconds_abbreviated'
- | 'timerOption_30_seconds_abbreviated'
- | 'timerOption_1_minute_abbreviated'
- | 'timerOption_5_minutes_abbreviated'
- | 'timerOption_30_minutes_abbreviated'
- | 'timerOption_1_hour_abbreviated'
- | 'timerOption_6_hours_abbreviated'
- | 'timerOption_12_hours_abbreviated'
- | 'timerOption_1_day_abbreviated'
- | 'timerOption_1_week_abbreviated'
- | 'timerOption_2_weeks_abbreviated'
| 'disappearingMessagesDisabled'
- | 'disabledDisappearingMessages'
- | 'youDisabledDisappearingMessages'
- | 'timerSetTo'
- | 'noteToSelf'
- | 'hideMenuBarTitle'
+ | 'displayName'
+ | 'displayNameEmpty'
+ | 'displayNameTooLong'
+ | 'document'
+ | 'documents'
+ | 'documentsEmptyState'
+ | 'done'
+ | 'downloadAttachment'
+ | 'editGroup'
+ | 'editGroupName'
+ | 'editMenuCopy'
+ | 'editMenuCut'
+ | 'editMenuDeleteContact'
+ | 'editMenuDeleteGroup'
+ | 'editMenuPaste'
+ | 'editMenuRedo'
+ | 'editMenuSelectAll'
+ | 'editMenuUndo'
+ | 'editProfileModalTitle'
+ | 'emptyGroupNameError'
+ | 'enable'
+ | 'endCall'
+ | 'enterAnOpenGroupURL'
+ | 'enterDisplayName'
+ | 'enterNewPassword'
+ | 'enterPassword'
+ | 'enterRecoveryPhrase'
+ | 'enterSessionID'
+ | 'enterSessionIDOfRecipient'
+ | 'enterSessionIDOrONSName'
+ | 'entireAccount'
+ | 'error'
+ | 'establishingConnection'
+ | 'expandedReactionsText'
+ | 'failedResolveOns'
+ | 'failedToAddAsModerator'
+ | 'failedToRemoveFromModerator'
+ | 'faq'
+ | 'fileSizeWarning'
+ | 'from'
+ | 'getStarted'
+ | 'goToReleaseNotes'
+ | 'goToSupportPage'
+ | 'groupMembers'
+ | 'groupNamePlaceholder'
+ | 'helpSettingsTitle'
+ | 'helpUsTranslateSession'
+ | 'hideBanner'
| 'hideMenuBarDescription'
- | 'startConversation'
+ | 'hideMenuBarTitle'
+ | 'hideRequestBanner'
+ | 'hideRequestBannerDescription'
+ | 'iAmSure'
+ | 'image'
+ | 'imageAttachmentAlt'
+ | 'imageCaptionIconAlt'
+ | 'incomingCallFrom'
+ | 'incomingError'
+ | 'invalidGroupNameTooLong'
+ | 'invalidGroupNameTooShort'
| 'invalidNumberError'
- | 'failedResolveOns'
- | 'autoUpdateSettingTitle'
- | 'autoUpdateSettingDescription'
- | 'autoUpdateNewVersionTitle'
- | 'autoUpdateNewVersionMessage'
- | 'autoUpdateNewVersionInstructions'
- | 'autoUpdateRestartButtonLabel'
- | 'autoUpdateLaterButtonLabel'
- | 'autoUpdateDownloadButtonLabel'
- | 'autoUpdateDownloadedMessage'
- | 'autoUpdateDownloadInstructions'
- | 'leftTheGroup'
- | 'multipleLeftTheGroup'
- | 'updatedTheGroup'
- | 'titleIsNow'
+ | 'invalidOldPassword'
+ | 'invalidOpenGroupUrl'
+ | 'invalidPassword'
+ | 'invalidPubkeyFormat'
+ | 'invalidSessionId'
+ | 'inviteContacts'
+ | 'join'
+ | 'joinACommunity'
+ | 'joinOpenGroup'
+ | 'joinOpenGroupAfterInvitationConfirmationDesc'
+ | 'joinOpenGroupAfterInvitationConfirmationTitle'
| 'joinedTheGroup'
- | 'multipleJoinedTheGroup'
+ | 'keepDisabled'
| 'kickedFromTheGroup'
- | 'multipleKickedFromTheGroup'
- | 'block'
- | 'unblock'
- | 'unblocked'
- | 'blocked'
- | 'blockedSettingsTitle'
- | 'conversationsSettingsTitle'
- | 'unbanUser'
- | 'userUnbanned'
- | 'userUnbanFailed'
- | 'banUser'
- | 'banUserAndDeleteAll'
- | 'userBanned'
- | 'userBanFailed'
- | 'leaveGroup'
+ | 'learnMore'
| 'leaveAndRemoveForEveryone'
+ | 'leaveGroup'
| 'leaveGroupConfirmation'
| 'leaveGroupConfirmationAdmin'
- | 'cannotRemoveCreatorFromGroup'
- | 'cannotRemoveCreatorFromGroupDesc'
- | 'noContactsForGroup'
- | 'failedToAddAsModerator'
- | 'failedToRemoveFromModerator'
- | 'copyMessage'
- | 'selectMessage'
- | 'editGroup'
- | 'editGroupName'
- | 'updateGroupDialogTitle'
- | 'showRecoveryPhrase'
- | 'yourSessionID'
- | 'setAccountPasswordTitle'
- | 'setAccountPasswordDescription'
- | 'changeAccountPasswordTitle'
- | 'changeAccountPasswordDescription'
- | 'removeAccountPasswordTitle'
- | 'removeAccountPasswordDescription'
- | 'enterPassword'
- | 'confirmPassword'
- | 'enterNewPassword'
- | 'confirmNewPassword'
- | 'showRecoveryPhrasePasswordRequest'
- | 'recoveryPhraseSavePromptMain'
- | 'invalidOpenGroupUrl'
- | 'copiedToClipboard'
- | 'passwordViewTitle'
- | 'password'
- | 'setPassword'
- | 'changePassword'
- | 'createPassword'
- | 'removePassword'
+ | 'leftTheGroup'
+ | 'lightboxImageAlt'
+ | 'linkDevice'
+ | 'linkPreviewDescription'
+ | 'linkPreviewsConfirmMessage'
+ | 'linkPreviewsTitle'
+ | 'linkVisitWarningMessage'
+ | 'linkVisitWarningTitle'
+ | 'loading'
+ | 'mainMenuEdit'
+ | 'mainMenuFile'
+ | 'mainMenuHelp'
+ | 'mainMenuView'
+ | 'mainMenuWindow'
+ | 'markAllAsRead'
+ | 'markUnread'
| 'maxPasswordAttempts'
- | 'typeInOldPassword'
- | 'invalidOldPassword'
- | 'invalidPassword'
- | 'noGivenPassword'
- | 'passwordsDoNotMatch'
- | 'setPasswordInvalid'
- | 'changePasswordInvalid'
- | 'removePasswordInvalid'
- | 'setPasswordTitle'
- | 'changePasswordTitle'
- | 'removePasswordTitle'
- | 'setPasswordToastDescription'
- | 'changePasswordToastDescription'
- | 'removePasswordToastDescription'
- | 'publicChatExists'
- | 'connectToServerFail'
- | 'connectingToServer'
- | 'connectToServerSuccess'
- | 'setPasswordFail'
- | 'passwordLengthError'
- | 'passwordTypeError'
- | 'passwordCharacterError'
- | 'remove'
- | 'invalidSessionId'
- | 'invalidPubkeyFormat'
- | 'emptyGroupNameError'
- | 'editProfileModalTitle'
- | 'groupNamePlaceholder'
- | 'inviteContacts'
- | 'addModerators'
- | 'removeModerators'
- | 'addAsModerator'
- | 'removeFromModerators'
- | 'add'
- | 'addingContacts'
- | 'noContactsToAdd'
- | 'noMembersInThisGroup'
- | 'noModeratorsToRemove'
- | 'onlyAdminCanRemoveMembers'
- | 'onlyAdminCanRemoveMembersDesc'
- | 'createAccount'
- | 'startInTrayTitle'
- | 'startInTrayDescription'
- | 'yourUniqueSessionID'
- | 'allUsersAreRandomly...'
- | 'getStarted'
- | 'createSessionID'
- | 'recoveryPhrase'
- | 'enterRecoveryPhrase'
- | 'displayName'
- | 'anonymous'
- | 'removeResidueMembers'
- | 'enterDisplayName'
- | 'continueYourSession'
- | 'linkDevice'
- | 'restoreUsingRecoveryPhrase'
- | 'or'
- | 'ByUsingThisService...'
- | 'beginYourSession'
- | 'welcomeToYourSession'
- | 'searchFor...'
- | 'searchForContactsOnly'
- | 'enterSessionID'
- | 'enterSessionIDOfRecipient'
- | 'message'
- | 'appearanceSettingsTitle'
- | 'privacySettingsTitle'
- | 'notificationsSettingsTitle'
- | 'audioNotificationsSettingsTitle'
- | 'notificationsSettingsContent'
- | 'notificationPreview'
- | 'recoveryPhraseEmpty'
- | 'displayNameEmpty'
- | 'displayNameTooLong'
+ | 'maximumAttachments'
+ | 'media'
+ | 'mediaEmptyState'
+ | 'mediaMessage'
+ | 'mediaPermissionsDescription'
+ | 'mediaPermissionsTitle'
| 'members'
- | 'activeMembers'
- | 'join'
- | 'joinOpenGroup'
- | 'createGroup'
- | 'create'
- | 'createClosedGroupNamePrompt'
- | 'createClosedGroupPlaceholder'
- | 'openGroupURL'
- | 'enterAnOpenGroupURL'
+ | 'message'
+ | 'messageBody'
+ | 'messageBodyMissing'
+ | 'messageDeletedPlaceholder'
+ | 'messageDeletionForbidden'
+ | 'messageRequestAccepted'
+ | 'messageRequestAcceptedOurs'
+ | 'messageRequestAcceptedOursNoName'
+ | 'messageRequestPending'
+ | 'messageRequests'
+ | 'messagesHeader'
+ | 'moreInformation'
+ | 'multipleJoinedTheGroup'
+ | 'multipleKickedFromTheGroup'
+ | 'multipleLeftTheGroup'
+ | 'mustBeApproved'
+ | 'nameAndMessage'
+ | 'nameOnly'
+ | 'newMessage'
+ | 'newMessages'
| 'next'
- | 'invalidGroupNameTooShort'
- | 'invalidGroupNameTooLong'
- | 'pickClosedGroupMember'
- | 'closedGroupMaxSize'
+ | 'nicknamePlaceholder'
+ | 'noAudioInputFound'
+ | 'noAudioOutputFound'
| 'noBlockedContacts'
- | 'userAddedToModerators'
- | 'userRemovedFromModerators'
- | 'orJoinOneOfThese'
- | 'helpUsTranslateSession'
- | 'closedGroupInviteFailTitle'
- | 'closedGroupInviteFailTitlePlural'
- | 'closedGroupInviteFailMessage'
- | 'closedGroupInviteFailMessagePlural'
- | 'closedGroupInviteOkText'
- | 'closedGroupInviteSuccessTitlePlural'
- | 'closedGroupInviteSuccessTitle'
- | 'closedGroupInviteSuccessMessage'
+ | 'noCameraFound'
+ | 'noContactsForGroup'
+ | 'noContactsToAdd'
+ | 'noGivenPassword'
+ | 'noMediaUntilApproved'
+ | 'noMembersInThisGroup'
+ | 'noMessageRequestsPending'
+ | 'noMessagesInBlindedDisabledMsgRequests'
+ | 'noMessagesInEverythingElse'
+ | 'noMessagesInNoteToSelf'
+ | 'noMessagesInReadOnly'
+ | 'noModeratorsToRemove'
+ | 'noNameOrMessage'
+ | 'noSearchResults'
+ | 'noteToSelf'
| 'notificationForConvo'
| 'notificationForConvo_all'
| 'notificationForConvo_disabled'
| 'notificationForConvo_mentions_only'
- | 'onionPathIndicatorTitle'
+ | 'notificationFrom'
+ | 'notificationMostRecent'
+ | 'notificationMostRecentFrom'
+ | 'notificationPreview'
+ | 'notificationSettingsDialog'
+ | 'notificationSubtitle'
+ | 'notificationsSettingsContent'
+ | 'notificationsSettingsTitle'
+ | 'oceanDarkThemeTitle'
+ | 'oceanLightThemeTitle'
+ | 'offline'
+ | 'ok'
+ | 'oneNonImageAtATimeToast'
| 'onionPathIndicatorDescription'
- | 'unknownCountry'
- | 'device'
- | 'destination'
- | 'learnMore'
- | 'linkVisitWarningTitle'
- | 'linkVisitWarningMessage'
+ | 'onionPathIndicatorTitle'
+ | 'onlyAdminCanRemoveMembers'
+ | 'onlyAdminCanRemoveMembersDesc'
| 'open'
- | 'audioMessageAutoplayTitle'
- | 'audioMessageAutoplayDescription'
- | 'clickToTrustContact'
- | 'trustThisContactDialogTitle'
- | 'trustThisContactDialogDescription'
+ | 'openGroupInvitation'
+ | 'openGroupURL'
+ | 'openMessageRequestInbox'
+ | 'openMessageRequestInboxDescription'
+ | 'or'
+ | 'orJoinOneOfThese'
+ | 'originalMessageNotFound'
+ | 'otherPlural'
+ | 'otherSingular'
+ | 'password'
+ | 'passwordCharacterError'
+ | 'passwordLengthError'
+ | 'passwordTypeError'
+ | 'passwordViewTitle'
+ | 'passwordsDoNotMatch'
+ | 'permissionsSettingsTitle'
+ | 'photo'
+ | 'pickClosedGroupMember'
| 'pinConversation'
- | 'unpinConversation'
- | 'markUnread'
- | 'showUserDetails'
- | 'sendRecoveryPhraseTitle'
- | 'sendRecoveryPhraseMessage'
- | 'dialogClearAllDataDeletionFailedTitle'
- | 'dialogClearAllDataDeletionFailedDesc'
- | 'dialogClearAllDataDeletionFailedTitleQuestion'
- | 'dialogClearAllDataDeletionFailedMultiple'
- | 'dialogClearAllDataDeletionQuestion'
- | 'clearDevice'
- | 'tryAgain'
- | 'areYouSureClearDevice'
- | 'deviceOnly'
- | 'entireAccount'
- | 'areYouSureDeleteDeviceOnly'
- | 'areYouSureDeleteEntireAccount'
- | 'iAmSure'
- | 'recoveryPhraseSecureTitle'
- | 'recoveryPhraseRevealMessage'
+ | 'pleaseWaitOpenAndOptimizeDb'
+ | 'previewThumbnail'
+ | 'primaryColor'
+ | 'primaryColorBlue'
+ | 'primaryColorGreen'
+ | 'primaryColorOrange'
+ | 'primaryColorPink'
+ | 'primaryColorPurple'
+ | 'primaryColorRed'
+ | 'primaryColorYellow'
+ | 'privacySettingsTitle'
+ | 'pruneSettingDescription'
+ | 'pruneSettingTitle'
+ | 'publicChatExists'
+ | 'quoteThumbnailAlt'
+ | 'rateLimitReactMessage'
+ | 'reactionListCountPlural'
+ | 'reactionListCountSingular'
+ | 'reactionNotification'
+ | 'reactionPopup'
+ | 'reactionPopupMany'
+ | 'reactionPopupOne'
+ | 'reactionPopupThree'
+ | 'reactionPopupTwo'
+ | 'readReceiptSettingDescription'
+ | 'readReceiptSettingTitle'
+ | 'received'
+ | 'recoveryPhrase'
+ | 'recoveryPhraseEmpty'
| 'recoveryPhraseRevealButtonText'
- | 'notificationSubtitle'
- | 'surveyTitle'
- | 'faq'
- | 'support'
- | 'clearAll'
- | 'clearDataSettingsTitle'
- | 'messageRequests'
- | 'blindedMsgReqsSettingTitle'
- | 'blindedMsgReqsSettingDesc'
- | 'requestsSubtitle'
+ | 'recoveryPhraseRevealMessage'
+ | 'recoveryPhraseSavePromptMain'
+ | 'recoveryPhraseSecureTitle'
+ | 'remove'
+ | 'removeAccountPasswordDescription'
+ | 'removeAccountPasswordTitle'
+ | 'removeFromModerators'
+ | 'removeModerators'
+ | 'removePassword'
+ | 'removePasswordInvalid'
+ | 'removePasswordTitle'
+ | 'removePasswordToastDescription'
+ | 'removeResidueMembers'
+ | 'replyToMessage'
+ | 'replyingToMessage'
+ | 'reportIssue'
| 'requestsPlaceholder'
- | 'hideRequestBannerDescription'
- | 'incomingCallFrom'
+ | 'requestsSubtitle'
+ | 'resend'
+ | 'respondingToRequestWarning'
+ | 'restoreUsingRecoveryPhrase'
| 'ringing'
- | 'establishingConnection'
- | 'accept'
- | 'decline'
- | 'endCall'
- | 'permissionsSettingsTitle'
- | 'helpSettingsTitle'
- | 'cameraPermissionNeededTitle'
- | 'cameraPermissionNeeded'
- | 'unableToCall'
- | 'unableToCallTitle'
- | 'callMissed'
- | 'callMissedTitle'
- | 'noCameraFound'
- | 'noAudioInputFound'
- | 'noAudioOutputFound'
- | 'callMediaPermissionsTitle'
- | 'callMissedCausePermission'
- | 'callMissedNotApproved'
- | 'callMediaPermissionsDescription'
- | 'callMediaPermissionsDialogContent'
- | 'callMediaPermissionsDialogTitle'
+ | 'save'
+ | 'saveLogToDesktop'
+ | 'saved'
+ | 'savedTheFile'
+ | 'searchFor...'
+ | 'searchForContactsOnly'
+ | 'searchMessagesHeader'
+ | 'selectMessage'
+ | 'sendFailed'
+ | 'sendMessage'
+ | 'sendRecoveryPhraseMessage'
+ | 'sendRecoveryPhraseTitle'
+ | 'sent'
+ | 'sessionMessenger'
+ | 'setAccountPasswordDescription'
+ | 'setAccountPasswordTitle'
+ | 'setDisplayPicture'
+ | 'setPassword'
+ | 'setPasswordFail'
+ | 'setPasswordInvalid'
+ | 'setPasswordTitle'
+ | 'setPasswordToastDescription'
+ | 'settingsHeader'
+ | 'shareBugDetails'
+ | 'show'
+ | 'showDebugLog'
+ | 'showRecoveryPhrase'
+ | 'showRecoveryPhrasePasswordRequest'
+ | 'showUserDetails'
+ | 'someOfYourDeviceUseOutdatedVersion'
+ | 'spellCheckDescription'
+ | 'spellCheckDirty'
+ | 'spellCheckTitle'
+ | 'stagedImageAttachment'
+ | 'stagedPreviewThumbnail'
+ | 'startConversation'
+ | 'startInTrayDescription'
+ | 'startInTrayTitle'
+ | 'startNewConversationBy...'
| 'startedACall'
- | 'answeredACall'
+ | 'support'
+ | 'surveyTitle'
+ | 'themesSettingTitle'
+ | 'theyChangedTheTimer'
+ | 'thisMonth'
+ | 'thisWeek'
+ | 'timerOption_0_seconds'
+ | 'timerOption_0_seconds_abbreviated'
+ | 'timerOption_10_seconds'
+ | 'timerOption_10_seconds_abbreviated'
+ | 'timerOption_12_hours'
+ | 'timerOption_12_hours_abbreviated'
+ | 'timerOption_1_day'
+ | 'timerOption_1_day_abbreviated'
+ | 'timerOption_1_hour'
+ | 'timerOption_1_hour_abbreviated'
+ | 'timerOption_1_minute'
+ | 'timerOption_1_minute_abbreviated'
+ | 'timerOption_1_week'
+ | 'timerOption_1_week_abbreviated'
+ | 'timerOption_2_weeks'
+ | 'timerOption_2_weeks_abbreviated'
+ | 'timerOption_30_minutes'
+ | 'timerOption_30_minutes_abbreviated'
+ | 'timerOption_30_seconds'
+ | 'timerOption_30_seconds_abbreviated'
+ | 'timerOption_5_minutes'
+ | 'timerOption_5_minutes_abbreviated'
+ | 'timerOption_5_seconds'
+ | 'timerOption_5_seconds_abbreviated'
+ | 'timerOption_6_hours'
+ | 'timerOption_6_hours_abbreviated'
+ | 'timerSetOnSync'
+ | 'timerSetTo'
+ | 'titleIsNow'
+ | 'to'
+ | 'today'
+ | 'tookAScreenshot'
| 'trimDatabase'
- | 'trimDatabaseDescription'
| 'trimDatabaseConfirmationBody'
- | 'pleaseWaitOpenAndOptimizeDb'
- | 'messageRequestPending'
- | 'messageRequestAccepted'
- | 'messageRequestAcceptedOurs'
- | 'messageRequestAcceptedOursNoName'
- | 'declineRequestMessage'
- | 'respondingToRequestWarning'
- | 'hideRequestBanner'
- | 'openMessageRequestInbox'
- | 'noMessageRequestsPending'
- | 'noMediaUntilApproved'
- | 'mustBeApproved'
+ | 'trimDatabaseDescription'
+ | 'trustThisContactDialogDescription'
+ | 'trustThisContactDialogTitle'
+ | 'tryAgain'
+ | 'typeInOldPassword'
+ | 'typingAlt'
+ | 'typingIndicatorsSettingDescription'
+ | 'typingIndicatorsSettingTitle'
+ | 'unableToCall'
+ | 'unableToCallTitle'
+ | 'unableToLoadAttachment'
+ | 'unbanUser'
+ | 'unblock'
+ | 'unblockToSend'
+ | 'unblocked'
+ | 'unknown'
+ | 'unknownCountry'
+ | 'unpinConversation'
+ | 'unreadMessages'
+ | 'updateGroupDialogTitle'
+ | 'updatedTheGroup'
+ | 'userAddedToModerators'
+ | 'userBanFailed'
+ | 'userBanned'
+ | 'userRemovedFromModerators'
+ | 'userUnbanFailed'
+ | 'userUnbanned'
+ | 'video'
+ | 'videoAttachmentAlt'
+ | 'viewMenuResetZoom'
+ | 'viewMenuToggleDevTools'
+ | 'viewMenuToggleFullScreen'
+ | 'viewMenuZoomIn'
+ | 'viewMenuZoomOut'
+ | 'voiceMessage'
+ | 'welcomeToYourSession'
+ | 'windowMenuClose'
+ | 'windowMenuMinimize'
+ | 'windowMenuZoom'
+ | 'yesterday'
+ | 'you'
+ | 'youChangedTheTimer'
+ | 'youDisabledDisappearingMessages'
+ | 'youGotKickedFromGroup'
| 'youHaveANewFriendRequest'
- | 'clearAllConfirmationTitle'
- | 'clearAllConfirmationBody'
- | 'noMessagesInReadOnly'
- | 'noMessagesInBlindedDisabledMsgRequests'
- | 'noMessagesInNoteToSelf'
- | 'noMessagesInEverythingElse'
- | 'hideBanner'
- | 'someOfYourDeviceUseOutdatedVersion'
- | 'openMessageRequestInboxDescription'
- | 'clearAllReactions'
- | 'expandedReactionsText'
- | 'reactionNotification'
- | 'rateLimitReactMessage'
- | 'otherSingular'
- | 'otherPlural'
- | 'reactionPopup'
- | 'reactionPopupOne'
- | 'reactionPopupTwo'
- | 'reactionPopupThree'
- | 'reactionPopupMany'
- | 'reactionListCountSingular'
- | 'reactionListCountPlural';
+ | 'youLeftTheGroup'
+ | 'yourSessionID'
+ | 'yourUniqueSessionID'
+ | 'zoomFactorSettingTitle';