Having Routing issue in angular

34 Views Asked by At

I have two modules - 1)AppRoutingModule 2)AdminRoutingModule

I have given route of signup/login component and lazily loaded AdminModule On AdminModule I have used AuthGuard

Now when navigate to login page , an alert is displayed stating that- you must login first for accessing this page. So for that I have checked whether the state.url includes(''). which is path for my login page. Still I am getting that alert on login page

This is my AppRoutingModule

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { SignupComponent } from './MyComponents/signup/signup.component';
import { AuthGuard } from './guards/auth.guard';

const routes: Routes = [
  { path: '', redirectTo: 'login', pathMatch: 'full' },
  {
    path: 'login',
    component: SignupComponent
  },
  {
    path: 'main',
    canActivate: [AuthGuard],
    loadChildren: () => import('./modules/admin/admin.module').then((m)=> m.AdminModule),
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

This is my AdminRoutingModule

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { MainComponent } from './components/main/main.component';
import { DashboardComponent } from './components/dashboard/dashboard.component';
import { HomeComponent } from './components/home/home.component';
import { UserListingComponent } from './components/user-listing/user-listing.component';

const routes: Routes = [
  {
    path: '', component: MainComponent,
    children: [
      { path: 'dashboard', component: DashboardComponent },
      { path: 'home', component: HomeComponent },
      { path: 'userListing', component: UserListingComponent },
      { path: '', redirectTo: '/main/home', pathMatch: 'full' }
    ]
  }
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class AdminRoutingModule { }

This is my AuthGuard

import { Injectable } from '@angular/core';

import {

  ActivatedRouteSnapshot,

  RouterStateSnapshot,

  Router,

  UrlTree,

} from '@angular/router';

import { UserService } from '../services/user.service';

import { Observable } from 'rxjs';


@Injectable({

  providedIn: 'root',

})

export class AuthGuard {

  constructor(public userService: UserService, public router: Router) {}

  canActivate(

    next: ActivatedRouteSnapshot,

    state: RouterStateSnapshot

  ): Observable<boolean> | Promise<boolean> | UrlTree | boolean {

    const Loginkey = this.userService.getLoggedInStatus()
    console.log('Loginkey',Loginkey)
    console.log('url',state.url)
    if (!Loginkey) {
       if(!state.url.includes('/login')){
      window.alert('Access Denied, Login is Required to Access This Page!');

      this.router.navigate(['login']);}
      return false;

    }

    return true;

  }

}

This is the UserService used in AuthGuard

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { signup } from '../data-type';
import { BehaviorSubject } from 'rxjs';
import { Router } from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class UserService {
  private readonly loggedInKey = 'isLoggedIn';

  isUserLoggedIn = new BehaviorSubject<boolean>(this.getLoggedInStatus());

  constructor(private http: HttpClient, private router: Router) {}

  public getLoggedInStatus(): boolean {
    return !!localStorage.getItem(this.loggedInKey);
  }

  private setLoggedInStatus(status: boolean): void {
    if (status) {
      localStorage.setItem(this.loggedInKey, 'true');
    } else {
      localStorage.removeItem(this.loggedInKey);
    }
  }

  userSignUp(data: signup): void {
    // Call your login API endpoint
    this.http.post('http://localhost:3000/login', data, { observe: 'response' })
      .subscribe(
        (result) => {
          // Handle a successful login
          this.setLoggedInStatus(true);
          this.router.navigate(['main']);
        },
        (error) => {
          // Handle login error
          console.error('Login error:', error);
        }
      );
  }

  userLogout(): void {
    this.setLoggedInStatus(false);
    // Navigate to the login page 
    this.router.navigate(['']);
  }
}

On Console I get state.url = /main/home , when I navigate to login page. That means it is using empty path which redirects to /main/home from AdminModule instead of login. I have understood the problem but can't figure it out. Early replies to the problem will be apretiated, Thanks in Advance!!

0

There are 0 best solutions below