Sfoglia il codice sorgente

Always do receiver type checking using typeguards

This is cleaner and more useful than using the ReceiverService methods,
since it also helps typechecking without casts.
Danilo Bargen 8 anni fa
parent
commit
21197c8bba

+ 2 - 2
src/partials/messenger.ts

@@ -1139,8 +1139,8 @@ class ReceiverDetailController {
         this.me = webClientService.me;
         this.me = webClientService.me;
 
 
         // Append group membership
         // Append group membership
-        if (this.receiver.type === 'contact') {
-            const contactReceiver = this.receiver as threema.ContactReceiver;
+        if (isContactReceiver(this.receiver)) {
+            const contactReceiver = this.receiver;
 
 
             this.contactService.requiredDetails(contactReceiver)
             this.contactService.requiredDetails(contactReceiver)
                 .then(() => {
                 .then(() => {

+ 2 - 1
src/services/message.ts

@@ -15,6 +15,7 @@
  * along with Threema Web. If not, see <http://www.gnu.org/licenses/>.
  * along with Threema Web. If not, see <http://www.gnu.org/licenses/>.
  */
  */
 
 
+import {isContactReceiver} from '../typeguards';
 import {ReceiverService} from './receiver';
 import {ReceiverService} from './receiver';
 
 
 export class MessageAccess {
 export class MessageAccess {
@@ -48,7 +49,7 @@ export class MessageService {
 
 
             if (receiver !== undefined && message.temporaryId === undefined) {
             if (receiver !== undefined && message.temporaryId === undefined) {
                 if (message.isOutbox === false
                 if (message.isOutbox === false
-                    && this.receiverService.isContact(receiver)
+                    && isContactReceiver(receiver)
                     && message.type !== 'voipStatus') {
                     && message.type !== 'voipStatus') {
                     access.ack = message.state !== 'user-ack';
                     access.ack = message.state !== 'user-ack';
                     access.dec = message.state !== 'user-dec';
                     access.dec = message.state !== 'user-dec';

+ 3 - 16
src/services/receiver.ts

@@ -15,6 +15,8 @@
  * along with Threema Web. If not, see <http://www.gnu.org/licenses/>.
  * along with Threema Web. If not, see <http://www.gnu.org/licenses/>.
  */
  */
 
 
+import {isContactReceiver} from '../typeguards';
+
 export class ReceiverService {
 export class ReceiverService {
     private activeReceiver: threema.Receiver;
     private activeReceiver: threema.Receiver;
 
 
@@ -51,23 +53,8 @@ export class ReceiverService {
             && a.id === b.id;
             && a.id === b.id;
     }
     }
 
 
-    public isContact(receiver: threema.Receiver): boolean {
-        return receiver !== undefined
-            && receiver.type === 'contact';
-    }
-
-    public isGroup(receiver: threema.Receiver): boolean {
-        return receiver !== undefined
-            && receiver.type === 'group';
-    }
-
-    public isDistributionList(receiver: threema.Receiver): boolean {
-        return receiver !== undefined
-            && receiver.type === 'distributionList';
-    }
-
     public isBusinessContact(receiver: threema.Receiver): boolean {
     public isBusinessContact(receiver: threema.Receiver): boolean {
-        return this.isContact(receiver)
+        return isContactReceiver(receiver)
             && receiver.id.substr(0, 1) === '*';
             && receiver.id.substr(0, 1) === '*';
 
 
     }
     }

+ 3 - 4
src/services/webclient.ts

@@ -1112,8 +1112,7 @@ export class WebClientService {
                 // Try to load receiver object
                 // Try to load receiver object
                 const receiverObject = this.receivers.getData(receiver);
                 const receiverObject = this.receivers.getData(receiver);
                 // Check blocked flag
                 // Check blocked flag
-                if (receiverObject.type === 'contact'
-                    && (receiverObject as threema.ContactReceiver).isBlocked) {
+                if (isContactReceiver(receiverObject) && receiverObject.isBlocked) {
                     return reject(this.$translate.instant('error.CONTACT_BLOCKED'));
                     return reject(this.$translate.instant('error.CONTACT_BLOCKED'));
                 }
                 }
                 // Decide on subtype
                 // Decide on subtype
@@ -2547,8 +2546,8 @@ export class WebClientService {
         let senderName = sender.id;
         let senderName = sender.id;
         if (sender.displayName) {
         if (sender.displayName) {
             senderName = sender.displayName;
             senderName = sender.displayName;
-        } else if (sender.type === 'contact') {
-            senderName = '~' + (sender as threema.ContactReceiver).publicNickname;
+        } else if (isContactReceiver(sender)) {
+            senderName = '~' + sender.publicNickname;
         }
         }
         const partner = this.receivers.getData({
         const partner = this.receivers.getData({
             id: message.partnerId,
             id: message.partnerId,

+ 9 - 3
src/typeguards.ts

@@ -22,20 +22,26 @@
 /**
 /**
  * Contact receiver type guard
  * Contact receiver type guard
  */
  */
-export function isContactReceiver(receiver: threema.Receiver): receiver is threema.ContactReceiver {
+export function isContactReceiver(
+    receiver: threema.BaseReceiver,
+): receiver is threema.ContactReceiver {
     return receiver.type === 'contact';
     return receiver.type === 'contact';
 }
 }
 
 
 /**
 /**
  * Group receiver type guard
  * Group receiver type guard
  */
  */
-export function isGroupReceiver(receiver: threema.Receiver): receiver is threema.GroupReceiver {
+export function isGroupReceiver(
+    receiver: threema.BaseReceiver,
+): receiver is threema.GroupReceiver {
     return receiver.type === 'group';
     return receiver.type === 'group';
 }
 }
 
 
 /**
 /**
  * Distribution list receiver type guard
  * Distribution list receiver type guard
  */
  */
-export function isDistributionListReceiver(receiver: threema.Receiver): receiver is threema.DistributionListReceiver {
+export function isDistributionListReceiver(
+    receiver: threema.BaseReceiver,
+): receiver is threema.DistributionListReceiver {
     return receiver.type === 'distributionList';
     return receiver.type === 'distributionList';
 }
 }