Real Time Connections page
Updating Order History View with Real Time Connection
Overview
In this part, we will:
- Install socket.io Client
 - Update list view on socket events.
 
P1: How to verify your solution is correct
If you’ve implemented the solution correctly you should now be able to navigate to http://localhost:4200/order-history and see orders be created, updated or removed without refreshing the page!
Install Socket.io Client and Types
npm install socket.io-client@2
npm install --save-dev @types/socket.io-client@1
Listen to Socket Events
We’ll use apiUrl for our Socket.io connection, and listen for orders created, order updated, and orders deleted events to change our list on:
✏️ Update src/app/order/history.component.ts
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Subject, takeUntil } from 'rxjs';
import io from 'socket.io-client';
import { ResponseData } from '../../restaurant/restaurant.service';
import { environment } from '../../../environments/environment';
import { Order, OrderService } from '../order.service';
interface Data<T> {
  value: T[];
  isPending: boolean;
}
@Component({
  selector: 'pmo-history',
  templateUrl: './history.component.html',
  styleUrl: './history.component.css',
})
export class HistoryComponent implements OnInit, OnDestroy {
  orders: Data<Order> = { value: [], isPending: true };
  private onDestroy$ = new Subject<void>();
  socket: SocketIOClient.Socket;
  constructor(private orderService: OrderService) {
    this.socket = io(environment.apiUrl);
  }
  ngOnInit(): void {
    this.getOrders();
    this.socket.on('orders created', (order: Order) => {
      this.orders.value.push(order);
    });
    this.socket.on('orders updated', (order: Order) => {
      const orderIndex = this.orders.value.findIndex(
        (item) => item._id === order._id
      );
      this.orders.value.splice(orderIndex, 1);
      this.orders.value.push(order);
    });
    this.socket.on('orders removed', (order: Order) => {
      const orderIndex = this.orders.value.findIndex(
        (item) => item._id === order._id
      );
      this.orders.value.splice(orderIndex, 1);
    });
  }
  ngOnDestroy(): void {
    this.socket.removeAllListeners();
    this.onDestroy$.next();
    this.onDestroy$.complete();
  }
  getOrders(): void {
    this.orderService
      .getOrders()
      .pipe(takeUntil(this.onDestroy$))
      .subscribe((res: ResponseData<Order>) => {
        this.orders.value = res.data;
      });
  }
  get newOrders(): Order[] {
    const orders = this.orders.value.filter((order) => {
      return order.status === 'new';
    });
    return orders;
  }
  get preparingOrders(): Order[] {
    const orders = this.orders.value.filter((order) => {
      return order.status === 'preparing';
    });
    return orders;
  }
  get deliveryOrders(): Order[] {
    const orders = this.orders.value.filter((order) => {
      return order.status === 'delivery';
    });
    return orders;
  }
  get deliveredOrders(): Order[] {
    const orders = this.orders.value.filter((order) => {
      return order.status === 'delivered';
    });
    return orders;
  }
}
 
Now as we create, update, and delete orders we can see them updated in real time across different browser tab instances!