diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 1c7f6ac9a..cb1f00a66 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -191,7 +191,7 @@ "confirm": "Confirm", "followSetting": "Follow Setting", "followSettingDisabled": "Messages you send will no longer disappear. Are you sure you want to turn off disappearing messages?", - "followSettingTimeAndType": "Set your messages to disappear $time$ after they have been $type$?", + "followSettingTimeAndType": "Set your messages to disappear $time$ after they have been $type$?", "youChangedTheTimer": "You have set messages to disappear $time$ after they have been $mode$", "youChangedTheTimerLegacy": "You set the disappearing message timer to $time$", "theyChangedTheTimer": "$name$ has set messages to disappear $time$ after they have been $mode$", diff --git a/ts/components/conversation/TimerNotification.tsx b/ts/components/conversation/TimerNotification.tsx index 758e4a6c7..d556d5afc 100644 --- a/ts/components/conversation/TimerNotification.tsx +++ b/ts/components/conversation/TimerNotification.tsx @@ -78,7 +78,7 @@ function useFollowSettingsButtonClick( props.timespanSeconds ?? undefined ); }, - showExitIcon: true, + showExitIcon: false, onClickClose: onExit, }) ); diff --git a/ts/components/dialog/SessionConfirm.tsx b/ts/components/dialog/SessionConfirm.tsx index 18cec46c9..3687461ec 100644 --- a/ts/components/dialog/SessionConfirm.tsx +++ b/ts/components/dialog/SessionConfirm.tsx @@ -1,6 +1,7 @@ -import { shell } from 'electron'; import { Dispatch } from '@reduxjs/toolkit'; +import { shell } from 'electron'; import React, { useState } from 'react'; +import styled from 'styled-components'; import { MessageInteraction } from '../../interactions'; import { updateConfirmModal } from '../../state/ducks/modalDialog'; import { SessionWrapperModal } from '../SessionWrapperModal'; @@ -10,6 +11,15 @@ import { SessionSpinner } from '../basic/SessionSpinner'; import { SpacerLG } from '../basic/Text'; import { SessionIcon, SessionIconSize, SessionIconType } from '../icon'; +const StyledSubText = styled(SessionHtmlRenderer)<{ textLength: number }>` + font-size: var(--font-size-md); + line-height: 1.5; + max-width: ${props => + props.textLength > 90 + ? '60ch' + : '33ch'}; // this is ugly, but we want the dialog description to have multiple lines when a short text is displayed +`; + export interface SessionConfirmDialogProps { message?: string; messageSub?: string; @@ -64,8 +74,6 @@ export const SessionConfirm = (props: SessionConfirmDialogProps) => { const cancelText = props.cancelText || window.i18n('cancel'); const showHeader = !!props.title; - const messageSubText = messageSub ? 'session-confirm-main-message' : undefined; - const onClickOkHandler = async () => { if (onClickOk) { setIsLoading(true); @@ -101,7 +109,6 @@ export const SessionConfirm = (props: SessionConfirmDialogProps) => { window.inboxStore?.dispatch(updateConfirmModal(null)); }; - return ( { )} - + diff --git a/ts/models/message.ts b/ts/models/message.ts index f7c49261e..4048a94b7 100644 --- a/ts/models/message.ts +++ b/ts/models/message.ts @@ -757,6 +757,7 @@ export class MessageModel extends Backbone.Model { * Also returns the uploaded ids to include in the message post so that those attachments are linked to that message. */ public async uploadData() { + const start = Date.now(); const finalAttachments = await Promise.all( (this.get('attachments') || []).map(loadAttachmentData) ); @@ -816,7 +817,10 @@ export class MessageModel extends Backbone.Model { attachments[0].flags = SignalService.AttachmentPointer.Flags.VOICE_MESSAGE; } - window.log.info(`Upload of message data for message ${this.idForLogging()} is finished.`); + window.log.info( + `Upload of message data for message ${this.idForLogging()} is finished in ${Date.now() - + start}ms.` + ); return { body, attachments, diff --git a/ts/session/apis/file_server_api/FileServerApi.ts b/ts/session/apis/file_server_api/FileServerApi.ts index b3720fa97..eb47c164d 100644 --- a/ts/session/apis/file_server_api/FileServerApi.ts +++ b/ts/session/apis/file_server_api/FileServerApi.ts @@ -5,7 +5,9 @@ import { parseBatchGlobalStatusCode, } from '../open_group_api/sogsv3/sogsV3BatchPoll'; -export const fileServerURL = 'http://filev2.getsession.org'; +export const fileServerHost = 'filev2.getsession.org'; +export const fileServerURL = `http://${fileServerHost}`; + export const fileServerPubKey = 'da21e1d886c6fbaea313f75298bd64aab03a97ce985b46bb2dad9f2089c8ee59'; const RELEASE_VERSION_ENDPOINT = '/session_version?platform=desktop'; diff --git a/ts/session/apis/snode_api/onions.ts b/ts/session/apis/snode_api/onions.ts index 95cc0e476..3768e2676 100644 --- a/ts/session/apis/snode_api/onions.ts +++ b/ts/session/apis/snode_api/onions.ts @@ -1,5 +1,6 @@ import https from 'https'; // eslint-disable import/no-named-default +// eslint-disable-next-line import/no-named-default import { AbortSignal } from 'abort-controller'; import ByteBuffer from 'bytebuffer'; import { to_string } from 'libsodium-wrappers-sumo'; @@ -19,6 +20,7 @@ import { toHex } from '../../utils/String'; import { Snode } from '../../../data/data'; import { callUtilsWorker } from '../../../webworker/workers/browser/util_worker_interface'; import { encodeV4Request } from '../../onions/onionv4'; +import { fileServerHost } from '../file_server_api/FileServerApi'; import { hrefPnServerProd } from '../push_notification_api/PnServer'; import { ERROR_CODE_NO_CONNECT } from './SNodeAPI'; @@ -854,6 +856,7 @@ async function sendOnionRequestHandlingSnodeEject({ response = result.response; if ( !isEmpty(finalRelayOptions) && + finalRelayOptions.host !== fileServerHost && response.status === 502 && response.statusText === 'Bad Gateway' ) { @@ -863,6 +866,7 @@ async function sendOnionRequestHandlingSnodeEject({ decodingSymmetricKey = result.decodingSymmetricKey; } catch (e) { window?.log?.warn('sendOnionRequestNoRetries error message: ', e.message); + if (e.code === 'ENETUNREACH' || e.message === 'ENETUNREACH' || throwErrors) { throw e; } diff --git a/ts/session/onions/onionSend.ts b/ts/session/onions/onionSend.ts index c040cb313..c2f827112 100644 --- a/ts/session/onions/onionSend.ts +++ b/ts/session/onions/onionSend.ts @@ -13,12 +13,12 @@ import { } from '../apis/open_group_api/sogsv3/sogsV3SendMessage'; import { pnServerPubkeyHex, pnServerUrl } from '../apis/push_notification_api/PnServer'; import { - buildErrorMessageWithFailedCode, FinalDestNonSnodeOptions, FinalRelayOptions, Onions, - SnodeResponse, STATUS_NO_STATUS, + SnodeResponse, + buildErrorMessageWithFailedCode, } from '../apis/snode_api/onions'; import { PROTOCOLS } from '../constants'; import { OnionV4 } from './onionv4'; @@ -239,13 +239,13 @@ const sendViaOnionV4ToNonSnodeWithRetries = async ( minTimeout: OnionSending.getMinTimeoutForSogs(), onFailedAttempt: e => { window?.log?.warn( - `sendViaOnionV4ToNonSnodeRetryable attempt #${e.attemptNumber} failed. ${e.retriesLeft} retries left...: ${e.message}` + `sendViaOnionV4ToNonSnodeWithRetries attempt #${e.attemptNumber} failed. ${e.retriesLeft} retries left...: ${e.message}` ); }, } ); } catch (e) { - window?.log?.warn('sendViaOnionV4ToNonSnodeRetryable failed ', e.message, throwErrors); + window?.log?.warn('sendViaOnionV4ToNonSnodeWithRetries failed ', e.message, throwErrors); if (throwErrors) { throw e; } diff --git a/ts/themes/globals.tsx b/ts/themes/globals.tsx index 680fca95f..4ff6d175a 100644 --- a/ts/themes/globals.tsx +++ b/ts/themes/globals.tsx @@ -141,7 +141,7 @@ export const THEME_GLOBALS: ThemeGlobals = { '--button-path-connecting-color': COLORS.PATH.CONNECTING, '--button-path-error-color': COLORS.PATH.ERROR, - '--modal-background-color': `rgba(${hexColorToRGB(COLORS.BLACK)}, 0.3)`, + '--modal-background-color': `rgba(${hexColorToRGB(COLORS.BLACK)}, 0.6)`, '--modal-drop-shadow': `0px 0px 10px rgba(${hexColorToRGB(COLORS.BLACK)}, 0.22)`, '--lightbox-background-color': `rgba(${hexColorToRGB(COLORS.BLACK)}, 0.8)`,