/** * This file is part of Threema Web. * * Threema Web is free software: you can redistribute it and/or modify it * under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero * General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Threema Web. If not, see . */ import {WebClientService} from '../services/webclient'; export default [ '$rootScope', '$timeout', '$filter', 'WebClientService', function($rootScope: ng.IRootScopeService, $timeout: ng.ITimeoutService, $filter: ng.IFilterService, webClientService: WebClientService) { return { restrict: 'E', scope: {}, bindToController: { type: '=eeeType', receiver: '=eeeReceiver', resolution: '=eeeResolution', }, controllerAs: 'ctrl', controller: [function() { this.highResolution = this.resolution === 'high'; this.isLoading = this.highResolution; this.backgroundColor = this.receiver.color; let loadingPromise: ng.IPromise = null; this.avatarClass = () => { return 'avatar-' + this.resolution + (this.isLoading ? ' is-loading' : ''); }; this.avatarExists = () => { if (this.receiver.avatar === undefined || this.receiver.avatar === null || this.receiver.avatar[this.resolution] === undefined || this.receiver.avatar[this.resolution] === null) { return false; } this.isLoading = false; // Reset background color this.backgroundColor = null; return true; }; /** * Return path to the default avatar. */ this.getDefaultAvatarUri = (type: threema.ReceiverType, highResolution: boolean) => { switch (type) { case 'group': return highResolution ? 'img/ic_group_picture_big.png' : 'img/ic_group_t.png'; case 'contact': case 'me': return highResolution ? 'img/ic_contact_picture_big.png' : 'img/ic_contact_picture_t.png'; case 'distributionList': return highResolution ? 'img/ic_distribution_list_t.png' : 'img/ic_distribution_list_t.png'; } return null; }; this.avatarToUri = (data: ArrayBuffer) => { if (data === null || data === undefined) { return ''; } return ($filter('bufferToUrl') as (data: ArrayBuffer, mime: string) => string)(data, 'image/png'); }; this.getAvatarUri = () => { if (this.avatarExists()) { return this.avatarToUri(this.receiver.avatar[this.resolution]); } else if (this.highResolution && this.receiver.avatar !== undefined && this.receiver.avatar.low !== undefined) { return this.avatarToUri(this.receiver.avatar.low); } return this.getDefaultAvatarUri(this.type, this.highResolution); }; this.requestAvatar = (inView: boolean) => { if (this.avatarExists()) { // do not request return; } if (inView) { if (loadingPromise === null) { // Do not wait on high resolution avatar const loadingTimeout = this.highResolution ? 0 : 500; loadingPromise = $timeout(() => { // show loading only on high res images! webClientService.requestAvatar({ type: this.type, id: this.receiver.id, } as threema.Receiver, this.highResolution).then((avatar) => { $rootScope.$apply(() => { this.isLoading = false; }); }).catch(() => { $rootScope.$apply(() => { this.isLoading = false; }); }); }, loadingTimeout); } } else if (loadingPromise !== null) { // Cancel pending avatar loading $timeout.cancel(loadingPromise); loadingPromise = null; } }; this.showWorkIndicator = () => { return this.type === 'contact' && !this.highResolution && (this.receiver as threema.ContactReceiver).identityType === threema.IdentityType.Work; }; this.showBlocked = () => { return this.type === 'contact' && !this.highResolution && (this.receiver as threema.ContactReceiver).isBlocked; }; }], template: `
Threema Work user
blocked icon
`, }; }, ];