@berry-cloud/ngx-unsplash
Version:
Lightweight Angular wrapper for the Unsplash API.
58 lines • 7.1 kB
JavaScript
import { Pipe } from '@angular/core';
import { decode } from 'blurhash';
import { Observable } from 'rxjs';
import * as i0 from "@angular/core";
class BlurHashPipe {
/**
* [BlurHash placeholder](https://unsplash.com/documentation#blurhash-placeholders).
*
* Returns a URL of the BlurHash preview and then the URL of photo once the
* photo been downloaded by the browser.
*
* @param photo to download
* @param size to be returned, the default is thumb
* @returns Observable of URL
*/
transform(photo, size = 'thumb') {
return new Observable((observer) => {
// Send URL of blur hash image
observer.next(this.getImageFromBlurHash(photo).toDataURL());
const img = new Image();
img.src = photo.urls[size];
img.onload = () => {
// Send URL of loaded image
observer.next(img.src);
observer.complete();
};
img.onerror = (err) => observer.error(err);
});
}
getImageFromBlurHash(photo) {
const canvas = document.createElement('canvas');
let width = photo.width || 240;
let r = width / 240;
canvas.width = width / r;
canvas.height = (photo.height || 180) / r;
try {
if (photo.blur_hash) {
const pixels = decode(photo.blur_hash, canvas.width, canvas.height);
const ctx = canvas.getContext('2d');
const imageData = ctx.createImageData(canvas.width, canvas.height);
imageData.data.set(pixels);
ctx.putImageData(imageData, 0, 0);
}
}
catch { }
return canvas;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: BlurHashPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.2.9", ngImport: i0, type: BlurHashPipe, name: "blurhash" }); }
}
export { BlurHashPipe };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: BlurHashPipe, decorators: [{
type: Pipe,
args: [{
name: 'blurhash',
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmx1cmhhc2gucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC11bnNwbGFzaC9zcmMvbGliL3BpcGVzL2JsdXJoYXNoLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUdsQyxNQUdhLFlBQVk7SUFDdkI7Ozs7Ozs7OztPQVNHO0lBQ0gsU0FBUyxDQUNQLEtBQVksRUFDWixPQUF1RCxPQUFPO1FBRTlELE9BQU8sSUFBSSxVQUFVLENBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUN6Qyw4QkFBOEI7WUFDOUIsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUU1RCxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtnQkFDaEIsMkJBQTJCO2dCQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLENBQUMsQ0FBQztZQUVGLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsS0FBWTtRQUN2QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWhELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDO1FBQy9CLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDcEIsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUxQyxJQUFJO1lBQ0YsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFO2dCQUNuQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxTQUFTLEdBQUcsR0FBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEUsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzNCLEdBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNwQztTQUNGO1FBQUMsTUFBTSxHQUFHO1FBQ1gsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs4R0FqRFUsWUFBWTs0R0FBWixZQUFZOztTQUFaLFlBQVk7MkZBQVosWUFBWTtrQkFIeEIsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsVUFBVTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdibHVyaGFzaCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQaG90byB9IGZyb20gJy4uL21vZGVsL3Bob3RvJztcblxuQFBpcGUoe1xuICBuYW1lOiAnYmx1cmhhc2gnLFxufSlcbmV4cG9ydCBjbGFzcyBCbHVySGFzaFBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIFtCbHVySGFzaCBwbGFjZWhvbGRlcl0oaHR0cHM6Ly91bnNwbGFzaC5jb20vZG9jdW1lbnRhdGlvbiNibHVyaGFzaC1wbGFjZWhvbGRlcnMpLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgVVJMIG9mIHRoZSBCbHVySGFzaCBwcmV2aWV3IGFuZCB0aGVuIHRoZSBVUkwgb2YgcGhvdG8gb25jZSB0aGVcbiAgICogcGhvdG8gYmVlbiBkb3dubG9hZGVkIGJ5IHRoZSBicm93c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gcGhvdG8gdG8gZG93bmxvYWRcbiAgICogQHBhcmFtIHNpemUgdG8gYmUgcmV0dXJuZWQsIHRoZSBkZWZhdWx0IGlzIHRodW1iXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgVVJMXG4gICAqL1xuICB0cmFuc2Zvcm0oXG4gICAgcGhvdG86IFBob3RvLFxuICAgIHNpemU6ICdyYXcnIHwgJ2Z1bGwnIHwgJ3JlZ3VsYXInIHwgJ3NtYWxsJyB8ICd0aHVtYicgPSAndGh1bWInXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHN0cmluZz4oKG9ic2VydmVyKSA9PiB7XG4gICAgICAvLyBTZW5kIFVSTCBvZiBibHVyIGhhc2ggaW1hZ2VcbiAgICAgIG9ic2VydmVyLm5leHQodGhpcy5nZXRJbWFnZUZyb21CbHVySGFzaChwaG90bykudG9EYXRhVVJMKCkpO1xuXG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGltZy5zcmMgPSBwaG90by51cmxzW3NpemVdO1xuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgLy8gU2VuZCBVUkwgb2YgbG9hZGVkIGltYWdlXG4gICAgICAgIG9ic2VydmVyLm5leHQoaW1nLnNyYyk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9O1xuXG4gICAgICBpbWcub25lcnJvciA9IChlcnIpID0+IG9ic2VydmVyLmVycm9yKGVycik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldEltYWdlRnJvbUJsdXJIYXNoKHBob3RvOiBQaG90byk6IEhUTUxDYW52YXNFbGVtZW50IHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblxuICAgIGxldCB3aWR0aCA9IHBob3RvLndpZHRoIHx8IDI0MDtcbiAgICBsZXQgciA9IHdpZHRoIC8gMjQwO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoIC8gcjtcbiAgICBjYW52YXMuaGVpZ2h0ID0gKHBob3RvLmhlaWdodCB8fCAxODApIC8gcjtcblxuICAgIHRyeSB7XG4gICAgICBpZiAocGhvdG8uYmx1cl9oYXNoKSB7XG4gICAgICAgIGNvbnN0IHBpeGVscyA9IGRlY29kZShwaG90by5ibHVyX2hhc2gsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBjdHghLmNyZWF0ZUltYWdlRGF0YShjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICBpbWFnZURhdGEuZGF0YS5zZXQocGl4ZWxzKTtcbiAgICAgICAgY3R4IS5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLCAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHsgfVxuICAgIHJldHVybiBjYW52YXM7XG4gIH1cbn1cbiJdfQ==