ngx-avatar-fork
Version:
A universal avatar component for Angular applications that fetches / generates avatar based on the information you have about the user.
119 lines • 15.8 kB
JavaScript
import { Injectable } from '@angular/core';
import { catchError, finalize, of, share, tap, throwError } from 'rxjs';
import { AvatarSource } from './sources/avatar-source.enum';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
import * as i2 from "./ngx-avatar-config.service";
/**
* list of Supported avatar sources
*/
export const defaultSources = [
AvatarSource.FACEBOOK,
AvatarSource.GOOGLE,
AvatarSource.TWITTER,
AvatarSource.INSTAGRAM,
AvatarSource.VKONTAKTE,
AvatarSource.SKYPE,
AvatarSource.GRAVATAR,
AvatarSource.GITHUB,
AvatarSource.CUSTOM,
AvatarSource.INITIALS,
AvatarSource.VALUE,
];
/**
* list of default colors
*/
export const defaultColors = ['#1abc9c', '#3498db', '#f1c40f', '#8e44ad', '#e74c3c', '#d35400', '#2c3e50', '#7f8c8d'];
/**
* Default request cache lifetime
*/
export const defaultCacheLifetimeSecond = 30 * 60;
/**
* Provides utilities methods related to Avatar component
*/
class NgxAvatarService {
constructor(http, avatarConfigService) {
this.http = http;
this.avatarConfigService = avatarConfigService;
this.avatarSources = defaultSources;
this.avatarColors = defaultColors;
this.cacheLifetimeSecond = defaultCacheLifetimeSecond;
this.failedSources = new Map();
this.cache = new Map();
this.requestCache = new Map();
this.overrideAvatarSources();
this.overrideAvatarColors();
this.overrideCacheLifetime();
}
fetchAvatar(avatarUrl) {
const cached = this.cache.get(avatarUrl);
if (cached) {
return cached.error ? throwError(() => cached.error) : of(cached.data);
}
let request = this.requestCache.get(avatarUrl);
if (request)
return request;
request = this.http.get(avatarUrl).pipe(tap(r => {
this.requestCache.delete(avatarUrl);
this.cache.set(avatarUrl, { data: r });
}), catchError(e => {
this.requestCache.delete(avatarUrl);
this.cache.set(avatarUrl, { error: e });
return throwError(() => e);
}), finalize(() => {
setTimeout(() => this.cache.delete(avatarUrl), this.cacheLifetimeSecond * 1000);
}), share());
this.requestCache.set(avatarUrl, request);
return request;
}
getRandomColor(avatarText) {
if (!avatarText) {
return 'transparent';
}
const asciiCodeSum = this.calculateAsciiCode(avatarText);
return this.avatarColors[asciiCodeSum % this.avatarColors.length];
}
compareSources(sourceType1, sourceType2) {
return this.getSourcePriority(sourceType1) - this.getSourcePriority(sourceType2);
}
isSource(source) {
return this.avatarSources.includes(source);
}
isTextAvatar(sourceType) {
return [AvatarSource.INITIALS, AvatarSource.VALUE].includes(sourceType);
}
buildSourceKey(source) {
return source.sourceType + '-' + source.sourceId;
}
sourceHasFailedBefore(source) {
return this.failedSources.has(this.buildSourceKey(source));
}
markSourceAsFailed(source) {
this.failedSources.set(this.buildSourceKey(source), source);
}
overrideAvatarSources() {
this.avatarSources = this.avatarConfigService.getAvatarSources(defaultSources);
}
overrideAvatarColors() {
this.avatarColors = this.avatarConfigService.getAvatarColors(defaultColors);
}
overrideCacheLifetime() {
this.cacheLifetimeSecond = this.avatarConfigService.getCacheLifetime(defaultCacheLifetimeSecond);
}
calculateAsciiCode(value) {
return value
.split('')
.map(letter => letter.charCodeAt(0))
.reduce((previous, current) => previous + current);
}
getSourcePriority(sourceType) {
return this.avatarSources.indexOf(sourceType);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: NgxAvatarService, deps: [{ token: i1.HttpClient }, { token: i2.NgxAvatarConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: NgxAvatarService }); }
}
export { NgxAvatarService };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: NgxAvatarService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.NgxAvatarConfigService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWF2YXRhci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWF2YXRhci9zcmMvbGliL25neC1hdmF0YXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdwRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFHNUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsWUFBWSxDQUFDLFFBQVE7SUFDckIsWUFBWSxDQUFDLE1BQU07SUFDbkIsWUFBWSxDQUFDLE9BQU87SUFDcEIsWUFBWSxDQUFDLFNBQVM7SUFDdEIsWUFBWSxDQUFDLFNBQVM7SUFDdEIsWUFBWSxDQUFDLEtBQUs7SUFDbEIsWUFBWSxDQUFDLFFBQVE7SUFDckIsWUFBWSxDQUFDLE1BQU07SUFDbkIsWUFBWSxDQUFDLE1BQU07SUFDbkIsWUFBWSxDQUFDLFFBQVE7SUFDckIsWUFBWSxDQUFDLEtBQUs7Q0FDbkIsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRXRIOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVsRDs7R0FFRztBQUNILE1BQ2EsZ0JBQWdCO0lBZTNCLFlBQW9CLElBQWdCLEVBQVUsbUJBQTJDO1FBQXJFLFNBQUksR0FBSixJQUFJLENBQVk7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TUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFVBQXdCO1FBQ2hELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEQsQ0FBQzs4R0F2R1UsZ0JBQWdCO2tIQUFoQixnQkFBZ0I7O1NBQWhCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmluYWxpemUsIE9ic2VydmFibGUsIG9mLCBzaGFyZSwgdGFwLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE5neEF2YXRhckNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL25neC1hdmF0YXItY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXZhdGFyU291cmNlIH0gZnJvbSAnLi9zb3VyY2VzL2F2YXRhci1zb3VyY2UuZW51bSc7XG5pbXBvcnQgeyBTb3VyY2UgfSBmcm9tICcuL3NvdXJjZXMvc291cmNlJztcblxuLyoqXG4gKiBsaXN0IG9mIFN1cHBvcnRlZCBhdmF0YXIgc291cmNlc1xuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFNvdXJjZXMgPSBbXG4gIEF2YXRhclNvdXJjZS5GQUNFQk9PSyxcbiAgQXZhdGFyU291cmNlLkdPT0dMRSxcbiAgQXZhdGFyU291cmNlLlRXSVRURVIsXG4gIEF2YXRhclNvdXJjZS5JTlNUQUdSQU0sXG4gIEF2YXRhclNvdXJjZS5WS09OVEFLVEUsXG4gIEF2YXRhclNvdXJjZS5TS1lQRSxcbiAgQXZhdGFyU291cmNlLkdSQVZBVEFSLFxuICBBdmF0YXJTb3VyY2UuR0lUSFVCLFxuICBBdmF0YXJTb3VyY2UuQ1VTVE9NLFxuICBBdmF0YXJTb3VyY2UuSU5JVElBTFMsXG4gIEF2YXRhclNvdXJjZS5WQUxVRSxcbl07XG5cbi8qKlxuICogbGlzdCBvZiBkZWZhdWx0IGNvbG9yc1xuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbG9ycyA9IFsnIzFhYmM5YycsICcjMzQ5OGRiJywgJyNmMWM0MGYnLCAnIzhlNDRhZCcsICcjZTc0YzNjJywgJyNkMzU0MDAnLCAnIzJjM2U1MCcsICcjN2Y4YzhkJ107XG5cbi8qKlxuICogRGVmYXVsdCByZXF1ZXN0IGNhY2hlIGxpZmV0aW1lXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q2FjaGVMaWZldGltZVNlY29uZCA9IDMwICogNjA7XG5cbi8qKlxuICogUHJvdmlkZXMgdXRpbGl0aWVzIG1ldGhvZHMgcmVsYXRlZCB0byBBdmF0YXIgY29tcG9uZW50XG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ3hBdmF0YXJTZXJ2aWNlIHtcbiAgcHVibGljIGF2YXRhclNvdXJjZXM6IEF2YXRhclNvdXJjZVtdID0gZGVmYXVsdFNvdXJjZXM7XG4gIHB1YmxpYyBhdmF0YXJDb2xvcnM6IHN0cmluZ1tdID0gZGVmYXVsdENvbG9ycztcbiAgcHVibGljIGNhY2hlTGlmZXRpbWVTZWNvbmQ6IG51bWJlciA9IGRlZmF1bHRDYWNoZUxpZmV0aW1lU2Vjb25kO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZmFpbGVkU291cmNlcyA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2U+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICBkYXRhPzogb2JqZWN0O1xuICAgICAgZXJyb3I/OiB1bmtub3duO1xuICAgIH1cbiAgPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPHVua25vd24+PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSBhdmF0YXJDb25maWdTZXJ2aWNlOiBOZ3hBdmF0YXJDb25maWdTZXJ2aWNlKSB7XG4gICAgdGhpcy5vdmVycmlkZUF2YXRhclNvdXJjZXMoKTtcbiAgICB0aGlzLm92ZXJyaWRlQXZhdGFyQ29sb3JzKCk7XG4gICAgdGhpcy5vdmVycmlkZUNhY2hlTGlmZXRpbWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBmZXRjaEF2YXRhcihhdmF0YXJVcmw6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuY2FjaGUuZ2V0KGF2YXRhclVybCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZC5lcnJvciA/IHRocm93RXJyb3IoKCkgPT4gY2FjaGVkLmVycm9yKSA6IG9mKGNhY2hlZC5kYXRhKTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdCA9IHRoaXMucmVxdWVzdENhY2hlLmdldChhdmF0YXJVcmwpO1xuICAgIGlmIChyZXF1ZXN0KSByZXR1cm4gcmVxdWVzdDtcblxuICAgIHJlcXVlc3QgPSB0aGlzLmh0dHAuZ2V0KGF2YXRhclVybCkucGlwZShcbiAgICAgIHRhcChyID0+IHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0Q2FjaGUuZGVsZXRlKGF2YXRhclVybCk7XG4gICAgICAgIHRoaXMuY2FjaGUuc2V0KGF2YXRhclVybCwgeyBkYXRhOiByIH0pO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGUgPT4ge1xuICAgICAgICB0aGlzLnJlcXVlc3RDYWNoZS5kZWxldGUoYXZhdGFyVXJsKTtcbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoYXZhdGFyVXJsLCB7IGVycm9yOiBlIH0pO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlKTtcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2FjaGUuZGVsZXRlKGF2YXRhclVybCksIHRoaXMuY2FjaGVMaWZldGltZVNlY29uZCAqIDEwMDApO1xuICAgICAgfSksXG4gICAgICBzaGFyZSgpLFxuICAgICk7XG5cbiAgICB0aGlzLnJlcXVlc3RDYWNoZS5zZXQoYXZhdGFyVXJsLCByZXF1ZXN0KTtcbiAgICByZXR1cm4gcmVxdWVzdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSYW5kb21Db2xvcihhdmF0YXJUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghYXZhdGFyVGV4dCkge1xuICAgICAgcmV0dXJuICd0cmFuc3BhcmVudCc7XG4gICAgfVxuICAgIGNvbnN0IGFzY2lpQ29kZVN1bSA9IHRoaXMuY2FsY3VsYXRlQXNjaWlDb2RlKGF2YXRhclRleHQpO1xuICAgIHJldHVybiB0aGlzLmF2YXRhckNvbG9yc1thc2NpaUNvZGVTdW0gJSB0aGlzLmF2YXRhckNvbG9ycy5sZW5ndGhdO1xuICB9XG5cbiAgcHVibGljIGNvbXBhcmVTb3VyY2VzKHNvdXJjZVR5cGUxOiBBdmF0YXJTb3VyY2UsIHNvdXJjZVR5cGUyOiBBdmF0YXJTb3VyY2UpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFNvdXJjZVByaW9yaXR5KHNvdXJjZVR5cGUxKSAtIHRoaXMuZ2V0U291cmNlUHJpb3JpdHkoc291cmNlVHlwZTIpO1xuICB9XG5cbiAgcHVibGljIGlzU291cmNlKHNvdXJjZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXZhdGFyU291cmNlcy5pbmNsdWRlcyhzb3VyY2UgYXMgQXZhdGFyU291cmNlKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1RleHRBdmF0YXIoc291cmNlVHlwZTogQXZhdGFyU291cmNlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFtBdmF0YXJTb3VyY2UuSU5JVElBTFMsIEF2YXRhclNvdXJjZS5WQUxVRV0uaW5jbHVkZXMoc291cmNlVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU291cmNlS2V5KHNvdXJjZTogU291cmNlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc291cmNlLnNvdXJjZVR5cGUgKyAnLScgKyBzb3VyY2Uuc291cmNlSWQ7XG4gIH1cblxuICBwdWJsaWMgc291cmNlSGFzRmFpbGVkQmVmb3JlKHNvdXJjZTogU291cmNlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmFpbGVkU291cmNlcy5oYXModGhpcy5idWlsZFNvdXJjZUtleShzb3VyY2UpKTtcbiAgfVxuXG4gIHB1YmxpYyBtYXJrU291cmNlQXNGYWlsZWQoc291cmNlOiBTb3VyY2UpOiB2b2lkIHtcbiAgICB0aGlzLmZhaWxlZFNvdXJjZXMuc2V0KHRoaXMuYnVpbGRTb3VyY2VLZXkoc291cmNlKSwgc291cmNlKTtcbiAgfVxuXG4gIHByaXZhdGUgb3ZlcnJpZGVBdmF0YXJTb3VyY2VzKCk6IHZvaWQge1xuICAgIHRoaXMuYXZhdGFyU291cmNlcyA9IHRoaXMuYXZhdGFyQ29uZmlnU2VydmljZS5nZXRBdmF0YXJTb3VyY2VzKGRlZmF1bHRTb3VyY2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgb3ZlcnJpZGVBdmF0YXJDb2xvcnMoKTogdm9pZCB7XG4gICAgdGhpcy5hdmF0YXJDb2xvcnMgPSB0aGlzLmF2YXRhckNvbmZpZ1NlcnZpY2UuZ2V0QXZhdGFyQ29sb3JzKGRlZmF1bHRDb2xvcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBvdmVycmlkZUNhY2hlTGlmZXRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZUxpZmV0aW1lU2Vjb25kID0gdGhpcy5hdmF0YXJDb25maWdTZXJ2aWNlLmdldENhY2hlTGlmZXRpbWUoZGVmYXVsdENhY2hlTGlmZXRpbWVTZWNvbmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVBc2NpaUNvZGUodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHZhbHVlXG4gICAgICAuc3BsaXQoJycpXG4gICAgICAubWFwKGxldHRlciA9PiBsZXR0ZXIuY2hhckNvZGVBdCgwKSlcbiAgICAgIC5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiBwcmV2aW91cyArIGN1cnJlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTb3VyY2VQcmlvcml0eShzb3VyY2VUeXBlOiBBdmF0YXJTb3VyY2UpIHtcbiAgICByZXR1cm4gdGhpcy5hdmF0YXJTb3VyY2VzLmluZGV4T2Yoc291cmNlVHlwZSk7XG4gIH1cbn1cbiJdfQ==