From d8381cfc47540a38abe4a2bd9dd65c372d87e61a Mon Sep 17 00:00:00 2001
From: Karel Bilek <kb@karelbilek.com>
Date: Fri, 1 Jan 2016 04:19:28 +0100
Subject: [PATCH] Dispatch an event after processing a group sync

Related #521
---
 js/libtextsecure.js               | 39 +++++++++++++++++--------------
 libtextsecure/message_receiver.js | 39 +++++++++++++++++--------------
 2 files changed, 44 insertions(+), 34 deletions(-)

diff --git a/js/libtextsecure.js b/js/libtextsecure.js
index 07ffa205d..c9451fe1b 100644
--- a/js/libtextsecure.js
+++ b/js/libtextsecure.js
@@ -36955,28 +36955,33 @@ MessageReceiver.prototype = {
         return this.handleAttachment(attachmentPointer).then(function() {
             var groupBuffer = new GroupBuffer(attachmentPointer.data);
             var groupDetails = groupBuffer.next();
+            var promises = [];
             while (groupDetails !== undefined) {
-                (function(groupDetails) {
+                var promise = (function(groupDetails) {
                     groupDetails.id = getString(groupDetails.id);
-                    textsecure.storage.groups.getGroup(groupDetails.id).
-                    then(function(existingGroup) {
-                        if (existingGroup === undefined) {
-                            return textsecure.storage.groups.createNewGroup(
-                                groupDetails.members, groupDetails.id
-                            );
-                        } else {
-                            return textsecure.storage.groups.updateNumbers(
-                                groupDetails.id, groupDetails.members
-                            );
-                        }
-                    }).then(function() {
-                        var ev = new Event('group');
-                        ev.groupDetails = groupDetails;
-                        eventTarget.dispatchEvent(ev);
-                    });
+                    return textsecure.storage.groups.getGroup(groupDetails.id).
+                        then(function(existingGroup) {
+                            if (existingGroup === undefined) {
+                                return textsecure.storage.groups.createNewGroup(
+                                    groupDetails.members, groupDetails.id
+                                );
+                            } else {
+                                return textsecure.storage.groups.updateNumbers(
+                                    groupDetails.id, groupDetails.members
+                                );
+                            }
+                        }).then(function() {
+                            var ev = new Event('group');
+                            ev.groupDetails = groupDetails;
+                            eventTarget.dispatchEvent(ev);
+                        });
                 })(groupDetails);
                 groupDetails = groupBuffer.next();
+                promises.push(promise);
             }
+            Promise.all(promises).then(function() {
+                eventTarget.dispatchEvent(new Event('groupsync'));
+            });
         });
     },
     handleAttachment: function(attachment) {
diff --git a/libtextsecure/message_receiver.js b/libtextsecure/message_receiver.js
index 315bbe087..f17a79001 100644
--- a/libtextsecure/message_receiver.js
+++ b/libtextsecure/message_receiver.js
@@ -223,28 +223,33 @@ MessageReceiver.prototype = {
         return this.handleAttachment(attachmentPointer).then(function() {
             var groupBuffer = new GroupBuffer(attachmentPointer.data);
             var groupDetails = groupBuffer.next();
+            var promises = [];
             while (groupDetails !== undefined) {
-                (function(groupDetails) {
+                var promise = (function(groupDetails) {
                     groupDetails.id = getString(groupDetails.id);
-                    textsecure.storage.groups.getGroup(groupDetails.id).
-                    then(function(existingGroup) {
-                        if (existingGroup === undefined) {
-                            return textsecure.storage.groups.createNewGroup(
-                                groupDetails.members, groupDetails.id
-                            );
-                        } else {
-                            return textsecure.storage.groups.updateNumbers(
-                                groupDetails.id, groupDetails.members
-                            );
-                        }
-                    }).then(function() {
-                        var ev = new Event('group');
-                        ev.groupDetails = groupDetails;
-                        eventTarget.dispatchEvent(ev);
-                    });
+                    return textsecure.storage.groups.getGroup(groupDetails.id).
+                        then(function(existingGroup) {
+                            if (existingGroup === undefined) {
+                                return textsecure.storage.groups.createNewGroup(
+                                    groupDetails.members, groupDetails.id
+                                );
+                            } else {
+                                return textsecure.storage.groups.updateNumbers(
+                                    groupDetails.id, groupDetails.members
+                                );
+                            }
+                        }).then(function() {
+                            var ev = new Event('group');
+                            ev.groupDetails = groupDetails;
+                            eventTarget.dispatchEvent(ev);
+                        });
                 })(groupDetails);
                 groupDetails = groupBuffer.next();
+                promises.push(promise);
             }
+            Promise.all(promises).then(function() {
+                eventTarget.dispatchEvent(new Event('groupsync'));
+            });
         });
     },
     handleAttachment: function(attachment) {