Commit graph

344 commits

Author SHA1 Message Date
Scott Nonnenberg
ca61c9cb85 Warnings for dangerous files 2018-10-09 13:48:32 -07:00
Scott Nonnenberg
8f3e3b7aaf Update to new design for avatars: individual/group icons/colors
And two initials.
2018-10-01 18:18:37 -07:00
Scott Nonnenberg
9c399624cc Support for blocking groups on mobile, via group/blocked syncs 2018-09-14 16:25:43 -07:00
Scott Nonnenberg
fedfbed304 Copy quoted message contents into quote on receipt
Also:
  - visually distinguish any reference we couldn't verify on receipt
  - show toast on quote click if we can't scroll to message
  - toast visuals redesigned to match rest of app
2018-08-15 14:58:55 -07:00
Scott Nonnenberg
3105b77475 Migrate to SQLCipher for messages/cache
Quite a few other fixes, including:
  - Sending to contact with no avatar yet (not synced from mobile)
  - Left pane doesn't update quickly or at all on new message
  - Left pane doesn't show sent or error status

Also:
 - Contributing.md: Ensure set of linux dev dependencies is complete
2018-07-31 17:08:45 -07:00
Scott Nonnenberg
53b1b73909 Ensure back button appears when safety number screen shows 2018-07-27 11:07:23 -07:00
Scott Nonnenberg
d51b2b48d1 Workaround for not ending up at bottom of conversation 2018-07-27 10:55:10 -07:00
Scott Nonnenberg
f39a96bc76 Move to centralized message/cache data layer
Also, ensure that conversation.messageCollection has nothing in it
unless it has an associated ConversationView.
2018-07-27 10:55:10 -07:00
Scott Nonnenberg
5933a34a18 Use window.log in browser context, turn on console eslint rule 2018-07-21 14:52:43 -07:00
Scott Nonnenberg
643739f65d
Responding to feedback on the updated visuals (#2549)
* Conversation List Item: timestamp bold only when convo has unread

* Preserve the positioning of overlays on re-entry into convo

* ConversationListItem: Handle missing and broken thumbnails

* Shorten timestamp in left pane for better Android consistency

* Update convo last updated if last was expire timer change

But not if it was from a sync instead of from you or from a contact.

* Make links in quotes the same color as the text

* MediaGridItem: Update placeholder icon colors for dark theme

* Ensure turning off timer shows 'Timer set to off' in left pane

* ConversationListItem: Show unread count in blue circle

* Add one pixel margin to blue indicator for text alignment

* Ensure replies to voice message can bet sent successfully
2018-07-20 16:37:57 -07:00
Scott Nonnenberg
66bd6c826d Fix MediaGallery handling of videos - show thumbnail and overlay 2018-07-18 19:40:07 -07:00
Scott Nonnenberg
5e64e4ef40 Remove verbose updateLastMessage logging, fix MediaGallery save 2018-07-18 12:06:35 -07:00
Scott Nonnenberg
6e4b73ec0c Fix lint errors in conversation_view.js 2018-07-18 09:44:14 -07:00
Scott Nonnenberg
db91560990 Fixes for quotes/schema upgrade, optimize media gallery load
Also: Fix for contact detail page; didn't show back button
2018-07-18 09:38:42 -07:00
Scott Nonnenberg
3c69886320 Finish new Message component, integrate into application
Also:
- New schema version 8 with video/image thumbnails, screenshots, sizes
- Upgrade messages not at current schema version when loading messages
  to show in conversation
- New MessageDetail react component
- New ConversationHeader react component
2018-07-17 15:58:07 -07:00
Scott Nonnenberg
212ec8bb73 Whenever user opens conversation, update its last message 2018-07-12 11:33:59 -07:00
Scott Nonnenberg
e30b34f424 Add 'newmessage' event handler to Conversation for reliablity 2018-07-05 09:32:14 -07:00
Scott Nonnenberg
12b5547e72 Update contents of conversation even when view not hydrated
Also ensure that we update the last message in a conversation after
expire, after the mesage is really deleted from the database.
2018-07-03 16:04:21 -07:00
Scott Nonnenberg
548c8e69cf Emojification now all done with react via a few new components
Three locations were changed:
  1. a group update, which lists a set of contacts
  2. the contact name in the left pane
  3. the conversation title

Three new components were added to window.Signal.Components to support
these scenarios, respectively:
  1. Emojify
  2. ContactName
  3. ConversationTitle

Note that there are a number of other places in the app that should be
emojified, but never have been before. Essentially any place that a
contact name might be shown. A non-exhaustive list:
  - Show group members
  - Show safety number
  - Verified change notification
  - Disappearing timer change notification
  - Contact verification notification
  - Quote contact name
2018-05-23 16:26:47 -07:00
Scott Nonnenberg
a5416e42c4 Refactor all emoji utility methods into window.Signal.Emoji 2018-05-23 16:26:47 -07:00
Scott Nonnenberg
d54aedcefa
A few fixes for the contact detail screen (#2374)
* Only show 'send message' on contact detail when user has account

* Make contact detail headers visible in dark mode

* Fix vertical scrolling for very large contact in detail pane

* Fix a couple comment typos
2018-05-23 12:15:46 -07:00
Scott Nonnenberg
4e5c8965ff Move to react for newlines, emoji, and links in message body 2018-05-14 16:09:37 -07:00
Daniel Gasienica
e723484498 Simplify closing emoji panel on escape key down 2018-05-08 17:30:11 -04:00
tommypacker
48708d5738 Close emoji panel on escape press 2018-05-08 17:25:20 -04:00
Scott Nonnenberg
37821e5a1b Wire up all contact behaviors, refactor Contact type/selector 2018-05-07 19:11:35 -07:00
Scott Nonnenberg
41be7f126b Visuals for embedded contacts as well as contact detail screen 2018-05-07 19:09:55 -07:00
Daniel Gasienica
13f1ec2e51 Use structured logs
Easier to search for static prefix and fields are named.
2018-05-03 13:24:39 -04:00
Daniel Gasienica
822850433e Apply manual fixes for ESLint errors 2018-04-30 16:53:34 -04:00
Daniel Gasienica
1dd87ad197 Format all source code using Prettier 2018-04-30 16:53:34 -04:00
Daniel Gasienica
fccbf70d57 Pre-process media for LightboxGallery 2018-04-30 11:59:26 -04:00
Daniel Gasienica
d00fb560b0 Avoid exposing AttachmentTS 2018-04-27 16:31:43 -04:00
Daniel Gasienica
e1b620602d Display attachments from disk 2018-04-27 16:31:43 -04:00
Daniel Gasienica
e2a2165d9c Remove lightbox on unload 2018-04-27 16:31:43 -04:00
Daniel Gasienica
45d6c7a5a8 Implement video support in lightbox 2018-04-27 16:31:42 -04:00
Daniel Gasienica
ac04f0648a Load more documents than media 2018-04-27 16:31:42 -04:00
Daniel Gasienica
b86f9c0be8 Allow saving of attachments from media gallery lightbox 2018-04-27 16:31:42 -04:00
Daniel Gasienica
b74b761255 Implement click to save for document list 2018-04-27 16:31:42 -04:00
Daniel Gasienica
954433366e Load documents for media gallery 2018-04-27 16:31:42 -04:00
Daniel Gasienica
2a5f513ebc Organize globals 2018-04-27 16:31:42 -04:00
Daniel Gasienica
bf3a547a76 Organize globals 2018-04-25 15:28:56 -04:00
Daniel Gasienica
8e3c38d5fe Fix formatting 2018-04-25 15:25:12 -04:00
Daniel Gasienica
96be0df8c7 Show lightbox controls based on presence of handlers 2018-04-25 15:24:52 -04:00
Daniel Gasienica
86a9923181 Remove TODOs 2018-04-25 15:24:52 -04:00
Daniel Gasienica
204de3aaea Lazily bind Signal.Components.MediaGallery 2018-04-25 15:24:52 -04:00
Daniel Gasienica
b4a4182613 Hide ‘Save As…’ button in media gallery
Wait until we support it.
2018-04-25 15:24:51 -04:00
Daniel Gasienica
0d676a65b8 Open media gallery item in lightbox 2018-04-25 15:24:51 -04:00
Daniel Gasienica
4ce0472b9f Extract Message.loadWithObjectURL 2018-04-25 15:24:51 -04:00
Daniel Gasienica
2dc3877fd4 Integrate visual media attachment gallery 2018-04-25 15:24:51 -04:00
Daniel Gasienica
f367a9b059 Move private method below public ones 2018-04-25 15:24:51 -04:00
Daniel Gasienica
d7b21ef5dc Render attachments grouped by date 2018-04-25 15:24:51 -04:00
Daniel Gasienica
ae419764bf Use arrow function over .bind 2018-04-25 15:24:51 -04:00
Daniel Gasienica
272c49c5bf Use existing ReactWrapper 2018-04-25 15:24:50 -04:00
Daniel Gasienica
32a3ef518b Render media gallery placeholder panel 2018-04-25 15:24:50 -04:00
Daniel Gasienica
273248d3fd Wire up ‘View All Media’ menu item 2018-04-25 15:24:50 -04:00
Scott Nonnenberg
21713cbce7
Update quotes to render emoji just like normal messages 2018-04-20 15:24:05 -07:00
Scott Nonnenberg
d0bcf506b4
Put focus in the message composition field on reply 2018-04-20 15:24:03 -07:00
Scott Nonnenberg
73edabfb17
Full pipeline to send quotes, including thumbnail upload 2018-04-20 15:23:57 -07:00
Scott Nonnenberg
13ce056830
Make thumbnails on quote load and on quote preview creation 2018-04-20 15:23:56 -07:00
Scott Nonnenberg
f4d9ab8ba0
Put quote preview in text box for Android, above it in iOS 2018-04-20 15:23:54 -07:00
Scott Nonnenberg
afad1a8d77
conversation_view: Remove logging in quote handling 2018-04-20 15:23:52 -07:00
Scott Nonnenberg
c71dcf0139
Show current quoted message above composition field
Note that substantial changes will be required for the updated Android
mockups, putting the quotation into the text box next to the attachment
preview.
2018-04-20 15:23:51 -07:00
Scott Nonnenberg
b4ff223d18
Refactor: Push selector logic for quote props into Message model 2018-04-20 15:23:49 -07:00
Scott Nonnenberg
d0b11c59f5
Eslintify conversation_view.js 2018-04-20 15:23:49 -07:00
Scott Nonnenberg
a6467d4fda
Constrain 'start recording' event listener to capture-audio only
(it was firing when clicking on a microphone icon in quotation!)
2018-04-13 18:10:52 -07:00
Scott Nonnenberg
32925ed026
Load attachment data for quotedMessages, processMessage on add
Not ideal that it loads it twice, but AttachmentView is so selfish with
its blob and objectUrl!
2018-04-13 18:10:50 -07:00
Scott Nonnenberg
0f8dd7e2db
Fix a number of lint failures 2018-04-13 18:10:48 -07:00
Scott Nonnenberg
1cc0633786
Full support for quotations in Android theme 2018-04-13 18:10:48 -07:00
Scott Nonnenberg
fb2ebddaa3
Remove expired message if it expired during database fetch (#1983)
* Log SyncMessage destination, even if it's a group

* Remove disappearing message even if deleted during fetch

This change fixes a potential race condition with disappearing message
removal from the UI. If the UI is in the middle of making a database
request for messages to display, then we need to wait for that to
complete before removing the newly-deleted expired message.
2018-01-23 12:27:34 -08:00
Scott Nonnenberg
e999473f19
Preserve disabled state in the middle of sending message (#1937)
* Preserve disabled state in send-message field on click

Also: get consistent in treatment of 'disabled' property.

* Add some comments explaining how audio recording dismissal works
2018-01-04 16:51:00 -08:00
Scott Nonnenberg
2430ee00d4
Emoji: Eliminate unused images, make sure panel clicks add emoji (#1849)
* Emoji: Ensure that all clicks work by using emoji data directly

* Eliminate a number of unused emoji images from final build

* Re-add the generic sheets directory, which we partially filter
2017-12-04 10:19:35 -08:00
Scott Nonnenberg
0e328f3911
Merge branch 'master' into development
This catches the development branch up with v1.0.39 in master.
2017-11-21 18:25:59 -08:00
Scott Nonnenberg
83428e5b81
Remove last seen indicator if we get a sync'd outgoing message (#1805)
This mirrors the way Android does things.
2017-11-21 14:41:05 -08:00
Lilia
fb931b4733 Emoji picker (#1608)
* Add emoji button and popup panel

This integrates a simple third party emoji panel with a few css overrides to
correct some relative paths and colors.

The trickiest thing about this is ensuring we don't break the layout, which is
acheived through precise control over the panel's height, and prodigious calls
to updateMessageFieldSize.

// FREEBIE

* Don't close emoji panel on click, do close on send

To better facilitate multiple emoji entry.

// FREEBIE

* Make panel emojis bigger and higher resolution

// FREEBIE

* Move paperclip button to the right of the microphone

This makes our bottom-bar button arrangement more comfortable and consistent
with Android.

// FREEBIE

* Move emoji picker padding to inner container

* Insert emojis at cursor position

Don't just append to the end like a n00b! Also handle selected text correctly.
https://stackoverflow.com/questions/11076975

// FREEBIE

* A few visual tweaks to reduce visual complexity of emoji panel

- No gray buffer on the right side of the emoji panel
- No gray buffer between message compose text box and emoji window
- The scroll bar for the emojis is the same as our normal scrollbars
2017-10-30 13:54:55 -07:00
Scott Nonnenberg
dabc56d0cf Load profiles for a conversation without blocking convo load (#1570) 2017-10-18 11:59:12 -07:00
Lilia
52cc8355a6 Feature: Blue check marks for read messages if opted in (#1489)
* Refactor delivery receipt event handler

* Rename the delivery receipt event

For less ambiguity with read receipts.

* Rename synced read event

For less ambiguity with read receipts from other Signal users.

* Add support for incoming receipt messages

Handle ReceiptMessages, which may include encrypted delivery receipts or read
receipts from recipients of our sent messages.

// FREEBIE

* Rename ReadReceipts to ReadSyncs

* Render read messages with blue double checks

* Send read receipts to senders of incoming messages

// FREEBIE

* Move ReadSyncs to their own file

// FREEBIE

* Fixup old comments on read receipts (now read syncs)

And some variable renaming for extra clarity.

// FREEBIE

* Add global setting for read receipts

Don't send read receipt messages unless the setting is enabled.
Don't process read receipts if the setting is disabled.

// FREEBIE

* Sync read receipt setting from mobile

Toggling this setting on your mobile device should sync it to Desktop. When
linking, use the setting in the provisioning message.

// FREEBIE

* Send receipt messages silently

Avoid generating phantom messages on ios

// FREEBIE

* Save recipients on the outgoing message models

For accurate tracking and display of sent/delivered/read state, even if group
membership changes later.

// FREEBIE

* Fix conversation type in profile key update handling

// FREEBIE

* Set recipients on synced sent messages

* Render saved recipients in message detail if available

For older messages, where we did not save the intended set of recipients at the
time of sending, fall back to the current group membership.

// FREEBIE

* Record who has been successfully sent to

// FREEBIE

* Record who a message has been delivered to

* Invert the not-clickable class

* Fix readReceipt setting sync when linking

* Render per recipient sent/delivered/read status

In the message detail view for outgoing messages, render each recipient's
individual sent/delivered/read status with respect to this message, as long as
there are no errors associated with the recipient (ie, safety number changes,
user not registered, etc...) since the error icon is displayed in that case.

*Messages sent before this change may not have per-recipient status lists
and will simply show no status icon.

// FREEBIE

* Add configuration sync request

Send these requests in a one-off fashion when:
  1. We have just setup from a chrome app import
  2. We have just upgraded to read-receipt support

// FREEBIE

* Expose sendRequestConfigurationSyncMessage

// FREEBIE

* Fix handling of incoming delivery receipts - union with array

FREEBIE
2017-10-04 15:28:43 -07:00
Scott Nonnenberg
314b29e426
Redact group ids in logging
FREEBIE
2017-09-25 16:41:57 -07:00
Lilia
42f2142e36 Fix RangeError on non-file drag/drop events (#1498)
ConversationView responds to drag/drop events by forwarding them to its file
input. The file input stops propagation and handles the event only if the data
transfer is type file. This means that any other data type (text, img, etc...)
causes an recursive loop of event propagation, eventually resulting in logging a
"RangeError: Maximum call stack size exceeded".

Fix by only forwarding files to the file input.

// FREEBIE
2017-09-22 09:44:09 -07:00
Lilia
ae190fed44
Profiles (#1453)
* Add AES-GCM encryption for profiles

With tests.

* Add profileKey to DataMessage protobuf

// FREEBIE

* Decrypt and save profile names

// FREEBIE

* Save incoming profile keys

* Move pad/unpad to crypto module

// FREEBIE

* Support fetching avatars from the cdn

// FREEBIE

* Translate failed authentication errors

When AES-GCM authentication fails, webcrypto returns a very generic error. The
same error is thrown for invalid length inputs, but our earlier checks in
decryptProfile should rule out those failure modes and leave us safe to assume
that we either had bad ciphertext or the wrong key.

// FREEBIE

* Handle profile avatars (wip) and log decrypt errors

// FREEBIE

* Display profile avatars

Synced contact avatars will still override profile avatars.

* Display profile names in convo list

Only if we don't have a synced contact name.

// FREEBIE

* Make cdn url an environment config

Use different ones for staging and production

// FREEBIE

* Display profile name in conversation header

* Display profile name in group messages

* Update conversation header if profile avatar changes

// FREEBIE

* Style profile names small with ~

* Save profileKeys from contact sync messages

// FREEBIE

* Save profile keys from provisioning messages

For standalone accounts, generate a random profile key.

// FREEBIE

* Special case for one-time sync of our profile key

Android will use a contact sync message to sync a profile key from Android
clients who have just upgraded and generated their profile key. Normally we
should receive this data in a provisioning message.

// FREEBIE

* Infer profile sharing from synced data messages

* Populate profile keys on outgoing messages

Requires that `profileSharing` be set on the conversation.

// FREEBIE

* Support for the profile key update flag

When receiving a message with this flag, don't init a message record, just
process the profile key and move on.

// FREEBIE

* Display profile names in group member list

* Refresh contact's profile on profile key changes

// FREEBIE

* Catch errors on profile save

// FREEBIE

* Save our own synced contact info

Don't return early if we get a contact sync for our own number

// FREEBIE
2017-09-14 17:04:00 -07:00
lilia
02df917f3a
Fix $name$ in confirmation dialogs
Our i18n shim supports multiple substitutions if you give it an array of strings
to use as replacements.

// FREEBIE
2017-09-14 16:53:51 -07:00
Scott Nonnenberg
8f0b0b121a
Add missing comma in ConversationView event list
FREEBIE
2017-09-14 16:53:49 -07:00
lilia
d2179b2c3f
Conversation view handles drag n drop events
By forwarding them to its file input.

// FREEBIE
2017-09-14 16:53:41 -07:00
lilia
8d32a3bebd
Remove dead code
This view doesn't contain any elements with class openInbox.

// FREEBIE
2017-09-14 16:53:41 -07:00
Scott Nonnenberg
675d41843e Re-enable message box if enter pressed with no text/files
Previously the message would stay disabled until the user clicked with
the mouse.

FREEBIE
2017-08-17 08:54:38 -07:00
Scott Nonnenberg
680f7d8b57 Additional logging for perf analysis and cross-device debuging
- How long it takes to get a message through the pre-send checks
- How long it takes to open a conversation for the first time
- The timestamp of any message we send to corellate with other logs
- Add conversation ID to 'decrypt old identity key errors' start/end

FREEBIE
2017-08-17 08:54:38 -07:00
Scott Nonnenberg
241e26dc17 Don't revoke convo avatar URL on unload - we will need it again
FREEBIE
2017-08-15 14:08:14 -07:00
Scott Nonnenberg
8700112f6d Decrypt any IncomingIdentityKeyError still sticking around
FREEBIE
2017-08-12 13:17:53 -07:00
Scott Nonnenberg
67cb9bdf54 Disable message box between send request and final send begin
Because we do a number of async checks before allowing the real send to
begin, on a slow matchine or when doing a lot of work (like receiving a
lot of messages) there can be a noticeable delay between hitting Enter
and the clearing of the text in the message box. In fact, newly-typed
text can be added to the previous message if the delay is long enough.

This prevents any interaction with the message box until the send has
either been prevented or has started.

FREEBIE
2017-08-11 18:55:16 -07:00
Scott Nonnenberg
e57f155403 Handle rejections from protocol layer (due to missing records)
isVerified and isUntrusted both went to the protocol layer, but were not
prepared for rejected promises resulting from missing records. This
prevented send in large groups where there has never been a message
exchanged with one of the members.

FREEBIE
2017-08-10 11:21:15 -07:00
Scott Nonnenberg
ec70170829 ConversationView.unload: Add ability to provide reason for logging
FREEBIE
2017-08-04 12:03:25 -07:00
Scott Nonnenberg
c0f8812f9b ConversationView: when windows are closed, call unload()
Anyway, unload() is a more comprehensive method for doing what the close
handler was trying to do before.

FREEBIE
2017-08-04 12:03:25 -07:00
Scott Nonnenberg
65283d2794 Unload conversations and old messages every half-hour
FREEBIE
2017-08-04 12:03:25 -07:00
Scott Nonnenberg
305bd6b3b8 App loading screen: show messages processed so far
Also, show the same loading screen on index.js before we've bootstrapped
the app.

FREEBIE
2017-08-04 12:03:25 -07:00
Scott Nonnenberg
53f2bfbb57 Animated loading screens on startup and first conversation load
FREEBIE
2017-08-04 12:03:25 -07:00
Scott Nonnenberg
b985228160 Last seen indicator/scroll down button - defensive removal
FREEBIE
2017-08-04 12:03:25 -07:00
Scott Nonnenberg
e6859a3684 Ensure that promises always resolve, or that rejections are okay 2017-08-04 12:03:25 -07:00
Scott Nonnenberg
5da324103a Throttle calls to getProfile when opening conversation
We don't want to throttle other calls to getProfile, so we localize this
to the fetch we do when we first open a conversation.

FREEBIE
2017-08-04 12:03:25 -07:00
Scott Nonnenberg
80a2a01e37 Remove jitter on verifying/unverifying safety number
On every click, even when sub-panes were open, we were calling
markRead(), which would save the conversation model with the new
unreadCount. The KeyVerificationPanelView was wired up to the change
event on conversation, so it would render with the results of that
update, then finally the user's intended update.

FREEBIE
2017-08-04 12:03:25 -07:00
Scott Nonnenberg
25243ad9de Send warning: Show single problematic group member, not group name
FREEBIE
2017-08-04 12:03:25 -07:00
Scott Nonnenberg
7ab20f09cc Fix focus issues with identity key send view
Tabbing right after entering the view would cause everythign to go crazy
as focus went back to the pane you were just on. This change both sets
the proper focus on load of that view (on the cancel button) and hides
other panes when they aren't active, only making them visible again when
they are once again the 'top' pane.

FREEBIE
2017-08-04 12:03:25 -07:00
Scott Nonnenberg
12914307f1 Improve experience when discovering identity key error on send
New experience in the Message Detail view when outgoing identity key
errors happen, matching the Android View.

'View' button is only shown on outgoing key errors right now.

When a contact with an outgoing identity key error is clicked, they are
taken to a view like the popup that comes up on Android: an explanation
of what happened and three options: 'Show Safety Number', 'Send Anyway',
and 'Cancel'

Contacts are now sorted alphabetically, with the set of contacts with
errors coming before the rest.

FREEBIE
2017-08-04 12:03:25 -07:00