diff --git a/jslib b/jslib
index e3ab324d59..56233e4002 160000
--- a/jslib
+++ b/jslib
@@ -1 +1 @@
-Subproject commit e3ab324d59ee04870007e5078901a22e4dd81440
+Subproject commit 56233e4002d809113aaf221d30a2472a2767df42
diff --git a/src/app/components/avatar.component.ts b/src/app/components/avatar.component.ts
deleted file mode 100644
index 1760c521f2..0000000000
--- a/src/app/components/avatar.component.ts
+++ /dev/null
@@ -1,138 +0,0 @@
-import {
- Component,
- Input,
- OnChanges,
- OnInit,
-} from '@angular/core';
-import { DomSanitizer } from '@angular/platform-browser';
-
-import { CryptoFunctionService } from 'jslib-common/abstractions/cryptoFunction.service';
-import { StateService } from 'jslib-common/abstractions/state.service';
-
-import { Utils } from 'jslib-common/misc/utils';
-
-@Component({
- selector: 'app-avatar',
- template: '',
-})
-export class AvatarComponent implements OnChanges, OnInit {
- @Input() data: string;
- @Input() email: string;
- @Input() size = 45;
- @Input() charCount = 2;
- @Input() textColor = '#ffffff';
- @Input() fontSize = 20;
- @Input() fontWeight = 300;
- @Input() dynamic = false;
- @Input() circle = false;
-
- src: string;
-
- constructor(public sanitizer: DomSanitizer, private cryptoFunctionService: CryptoFunctionService,
- private stateService: StateService) { }
-
- ngOnInit() {
- if (!this.dynamic) {
- this.generate();
- }
- }
-
- ngOnChanges() {
- if (this.dynamic) {
- this.generate();
- }
- }
-
- private async generate() {
- const enableGravatars = await this.stateService.get('enableGravatars');
- if (enableGravatars && this.email != null) {
- const hashBytes = await this.cryptoFunctionService.hash(this.email.toLowerCase().trim(), 'md5');
- const hash = Utils.fromBufferToHex(hashBytes).toLowerCase();
- this.src = 'https://www.gravatar.com/avatar/' + hash + '?s=' + this.size + '&r=pg&d=retro';
- } else {
- let chars: string = null;
- const upperData = this.data.toUpperCase();
-
- if (this.charCount > 1) {
- chars = this.getFirstLetters(upperData, this.charCount);
- }
- if (chars == null) {
- chars = this.unicodeSafeSubstring(upperData, this.charCount);
- }
-
- // If the chars contain an emoji, only show it.
- if (chars.match(Utils.regexpEmojiPresentation)) {
- chars = chars.match(Utils.regexpEmojiPresentation)[0];
- }
-
- const charObj = this.getCharText(chars);
- const color = this.stringToColor(upperData);
- const svg = this.getSvg(this.size, color);
- svg.appendChild(charObj);
- const html = window.document.createElement('div').appendChild(svg).outerHTML;
- const svgHtml = window.btoa(unescape(encodeURIComponent(html)));
- this.src = 'data:image/svg+xml;base64,' + svgHtml;
- }
- }
-
- private stringToColor(str: string): string {
- let hash = 0;
- for (let i = 0; i < str.length; i++) {
- // tslint:disable-next-line
- hash = str.charCodeAt(i) + ((hash << 5) - hash);
- }
- let color = '#';
- for (let i = 0; i < 3; i++) {
- // tslint:disable-next-line
- const value = (hash >> (i * 8)) & 0xFF;
- color += ('00' + value.toString(16)).substr(-2);
- }
- return color;
- }
-
- private getFirstLetters(data: string, count: number): string {
- const parts = data.split(' ');
- if (parts.length > 1) {
- let text = '';
- for (let i = 0; i < count; i++) {
- text += this.unicodeSafeSubstring(parts[i], 1);
- }
- return text;
- }
- return null;
- }
-
- private getSvg(size: number, color: string): HTMLElement {
- const svgTag = window.document.createElement('svg');
- svgTag.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
- svgTag.setAttribute('pointer-events', 'none');
- svgTag.setAttribute('width', size.toString());
- svgTag.setAttribute('height', size.toString());
- svgTag.style.backgroundColor = color;
- svgTag.style.width = size + 'px';
- svgTag.style.height = size + 'px';
- return svgTag;
- }
-
- private getCharText(character: string): HTMLElement {
- const textTag = window.document.createElement('text');
- textTag.setAttribute('text-anchor', 'middle');
- textTag.setAttribute('y', '50%');
- textTag.setAttribute('x', '50%');
- textTag.setAttribute('dy', '0.35em');
- textTag.setAttribute('pointer-events', 'auto');
- textTag.setAttribute('fill', this.textColor);
- textTag.setAttribute('font-family', '"Open Sans","Helvetica Neue",Helvetica,Arial,' +
- 'sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"');
- textTag.textContent = character;
- textTag.style.fontWeight = this.fontWeight.toString();
- textTag.style.fontSize = this.fontSize + 'px';
- return textTag;
- }
-
- private unicodeSafeSubstring(str: string, count: number) {
- const characters = str.match(/./ug);
- return characters != null ? characters.slice(0, count).join('') : '';
- }
-}
diff --git a/src/app/oss.module.ts b/src/app/oss.module.ts
index 79f13863d6..e25810130a 100644
--- a/src/app/oss.module.ts
+++ b/src/app/oss.module.ts
@@ -11,7 +11,6 @@ import { RouterModule } from '@angular/router';
import { ToasterModule } from 'angular2-toaster';
import { InfiniteScrollModule } from 'ngx-infinite-scroll';
-import { AvatarComponent } from './components/avatar.component';
import { NestedCheckboxComponent } from './components/nested-checkbox.component';
import { PasswordRepromptComponent } from './components/password-reprompt.component';
import { PasswordStrengthComponent } from './components/password-strength.component';
@@ -175,6 +174,7 @@ import { VaultComponent } from './vault/vault.component';
import { ProvidersComponent } from './providers/providers.component';
+import { AvatarComponent } from 'jslib-angular/components/avatar.component';
import { CalloutComponent } from 'jslib-angular/components/callout.component';
import { IconComponent } from 'jslib-angular/components/icon.component';