Angular πŸ‡ΊπŸ‡¦ - practical notes
1.63K subscribers
1.6K photos
1 file
532 links
Angular - practical notes

This group is for posting practical notes for Angular developers. Mostly all posts are for quick implementation https://t.me/angular_practical_notes (Commenting on posts only in ENG and UA langs here). Welcome!
Download Telegram
πŸ“„ Transitioning to Angular 17’s New Control Flow Syntax

#angular #controlFlow

🚩 > Angular v17

βœ… Article link: https://medium.com/@dimeloper/transitioning-to-angular-17s-new-control-flow-syntax-0555aa45f06f
πŸ”₯1
πŸ“„ Exploring the New Object.groupBy Function in Chrome 117

#js #groupBy

βœ… Article link: https://medium.com/@bhargavr445/exploring-the-new-object-groupby-function-in-chrome-117-028820848433
πŸ”₯1
πŸ“„ Card Composite via @ViewChildren in Angular

#angular #decorator #ViewChildren

Imagine the following requirements for your Angular app:

- Your customer wants a view that displays multiple cards at once.
- A button at the top of the page should toggle the edit mode.
- While in edit mode, all cards are editable at the same time.
- As soon as you click β€œsave” only those cards that actually have been edited are going to send a request to the server.
- If you decide to discard the changes by clicking on β€œcancel” all cards should be reset to their initial state.

This is a common scenario in any more sophisticated web application. Nevertheless, I just recently discovered a very handy way to handle those requirements in Angular. In this article I want to share my solution, leveraging the
@ViewChildren property decorator to implement the Card Composite pattern.


βœ… Article link: https://blog.stackademic.com/card-composite-via-viewchildren-in-angular-aa3317f92f82
πŸ‘2πŸ”₯1
πŸ“„ Angular Interceptors: Authentication Interceptor

#angular #interceptor

An authentication interceptor is used to add authentication tokens to outgoing requests and handle authentication-related errors. This is essential for securing your application’s API requests.


import { Injectable } from '@angular/core';
import {
HttpInterceptor,
HttpRequest,
HttpHandler,
} from '@angular/common/http';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler) {
const authToken = 'your-auth-token';
const authRequest = request.clone({
headers: request.headers.set('Authorization', `Bearer ${authToken}`),
});
return next.handle(authRequest);
}
}
πŸ”₯2
πŸ“„ Angular Interceptors: Error Handling Interceptor

#angular #interceptor

An error handling interceptor can be used to centralize error handling for HTTP requests. It can capture HTTP errors, log them, and perform appropriate actions like displaying error messages.


import { Injectable } from '@angular/core';
import {
HttpInterceptor,
HttpRequest,
HttpHandler,
HttpErrorResponse,
} from '@angular/common/http';
import { catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';

@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler) {
return next.handle(request).pipe(
catchError((error: HttpErrorResponse) => {
// Handle and log the error here
console.error('HTTP Error:', error);
// Optionally rethrow the error to propagate it
return throwError(error);
})
);
}
}
πŸ”₯2
πŸ“„ Angular Pipes: Uppercase First Pipe

#angular #pipe

This pipe capitalizes the first letter of a string while keeping the rest in lowercase.


import { Pipe, PipeTransform } from '@angular/core';

@Pipe({ name: 'uppercaseFirst' })
export class UppercaseFirstPipe implements PipeTransform {
transform(value: string): string {
if (!value) return value;
return value
.charAt(0)
.toUpperCase() + value.slice(1).toLowerCase();
}
}


Usage in an Angular template:

<p>{{ 'hello world' | uppercaseFirst }}</p>
<!-- Output: "Hello world" -->
❀1πŸ‘1πŸ”₯1
πŸ“„ Downloading a PDF from a BASE64 String in Angular

#angular #pdf #base64

⚠️ The example is for presentation purposes only and can be refactored.

βœ… Article link: https://kalanavw.medium.com/downloading-a-pdf-from-a-base64-string-in-angular-afe50fca1538
πŸ‘1
Hello, friends!
As you can see, I'm a Ukrainian software engineer who tries to do volunteer fundraisers to support the Armed Forces of Ukraine. Sometimes it takes a lot of time and I am not able to maintain this channel for you. Please help me close these fundraisers because without the Ukrainian army there will be nothing Ukrainian. Thank you very much!

πŸ’΅ FOR Ukraine:
https://send.monobank.ua/jar/5FDvaBP4zn
5375 4114 1222 8582

🌎 FOR ALL DONATS:

πŸ’΅ SWIFT code: UNJSUAUKXXX

πŸ’΅ PayPal: luckystudydanit@gmail.com

My profile with reports after closing fundraiser :
https://www.facebook.com/volunt2erua/

also all reports in our πŸš€ channel:
https://t.me/toxicc_squad
Please open Telegram to view this post
VIEW IN TELEGRAM
❀5πŸ‘2
πŸ“„ Angular Interceptors: Logging Interceptor

#angular #interceptor

A logging interceptor can be used to log the details of HTTP requests and responses, which is helpful for debugging and monitoring.


import { Injectable } from '@angular/core';
import {
HttpInterceptor,
HttpRequest,
HttpHandler,
HttpResponse,
} from '@angular/common/http';
import { tap } from 'rxjs/operators';

@Injectable()
export class LoggingInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler) {
return next.handle(request).pipe(
tap((event) => {
if (event instanceof HttpResponse) {
console.log('HTTP Response:', event);
}
})
);
}
}
πŸ“„ Angular Pipes: Reverse String Pipe

#angular #pipe

This pipe reverses the characters of a string.


import { Pipe, PipeTransform } from '@angular/core';

@Pipe({ name: 'reverseString' })
export class RSPipe implements PipeTransform {
transform(value: string): string {
if (!value) return value;
return value.split('').reverse().join('');
}
}


Usage in an Angular template:

<p>{{ 'Angular' | reverseString }}</p>
<!-- Output: "ralugnA" -->
πŸ”₯1
πŸ“„ Angular Interceptors: Caching Interceptor

#angular #interceptor

A caching interceptor can be used to implement client-side caching for HTTP responses, reducing the number of unnecessary network requests.


import { Injectable } from '@angular/core';
import {
HttpInterceptor,
HttpRequest,
HttpHandler,
HttpResponse,
HttpHeaders,
} from '@angular/common/http';
import { tap } from 'rxjs/operators';

@Injectable()
export class CacheInterceptor implements HttpInterceptor {
private cache = new Map<string, HttpResponse<unknown>>();

intercept(
request: HttpRequest<unknown>,
next: HttpHandler
) {
if (request.method !== 'GET') {
return next.handle(request);
}

const cachedResponse = this.cache.get(request.url);

if (cachedResponse) {
return of(cachedResponse);
}

return next.handle(request).pipe(
tap((event) => {
if (event instanceof HttpResponse) {
this.cache.set(request.url, event);
}
})
);
}
}
πŸ”₯1
πŸ“„ Angular Interceptors: Headers Interceptor

#angular #interceptor

A headers interceptor can be used to add custom headers to outgoing HTTP requests. This is often used to set headers like β€˜Content-Type’ or include API keys.


import { Injectable } from '@angular/core';
import {
HttpInterceptor,
HttpRequest,
HttpHandler,
} from '@angular/common/http';

@Injectable()
export class HeadersInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<unknown>, next: HttpHandler) {
const headers = new HttpHeaders({
'Content-Type': 'application/json',
'X-API-Key': 'your-api-key',
});
const headersRequest = request.clone({ headers });
return next.handle(headersRequest);
}
}
πŸ”₯1
πŸ“„ Angular Pipes: Phone Number Formatter Pipe

#angular #pipe

Formats a raw string of numbers into a well-structured phone number format (e.g., (555) 555–5555).


import { Pipe, PipeTransform } from '@angular/core';

@Pipe({ name: 'phoneNumberFormatter' })
export class PNFPipe implements PipeTransform {
transform(value: string): string {
if (!value || value.length !== 10) return value;
return `(${value.slice(0, 3)}) ${value.slice(3, 6)}-${value.slice(6)}`;
}
}


Usage in an Angular template:

<p>{{ '1234567890' | phoneNumberFormatter }}</p>
<!-- Output: "(123) 456-7890" -->
πŸ”₯1
πŸ“„ Angular Interceptors: Loading Indicator Interceptor

#angular #interceptor

A loading indicator interceptor can be used to show and hide loading spinners or progress bars during HTTP requests, providing a better user experience.


import { Injectable } from '@angular/core';
import {
HttpInterceptor,
HttpRequest,
HttpHandler,
} from '@angular/common/http';
import { LoadingService } from './loading.service';
import { finalize } from 'rxjs/operators';

@Injectable()
export class LoadingInterceptor implements HttpInterceptor {
constructor(
private loadingService: LoadingService
) {}

intercept(
request: HttpRequest<unknown>,
next: HttpHandler
) {
this.loadingService.showLoading();
return next.handle(request).pipe(
finalize(() => {
this.loadingService.hideLoading();
})
);
}
}
πŸ‘1πŸ”₯1
πŸ“„ Angular Pipes: File Size Pipe

#angular #pipe

Converts a file size in bytes to a more human-readable format, such as KB, MB, or GB.


import { Pipe, PipeTransform } from '@angular/core';

@Pipe({ name: 'fileSize' })
export class FileSizePipe implements PipeTransform {
transform(bytes: number): string {
if (isNaN(bytes) || bytes === 0) return '0 Bytes';

const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
const i = Math.floor(
Math.log(bytes) / Math.log(1024)
);
return `${parseFloat((bytes / Math.pow(1024, i)).toFixed(2))} ${sizes[i]}`;
}
}


Usage in an Angular template:

<p>{{ 1024 | fileSize }}</p>
<!-- Output: "1 KB" -->
πŸ”₯2