Okay so I am building a small project and I ran into an issue when trying to add AuthGuard. So I already did this in some of my other apps and it worked fine (Used angular and firebase aswell not Ionic tho). But I keep getting this error no matter what I do:
main.ts:14 ERROR NullInjectorError: R3InjectorError(Environment Injector)[AuthGuard -> AngularFireAuth -> InjectionToken angularfire2.app.options -> InjectionToken angularfire2.app.options]:
NullInjectorError: No provider for InjectionToken angularfire2.app.options!
at NullInjector.get (core.mjs:1654:27)
at R3Injector.get (core.mjs:3093:33)
at R3Injector.get (core.mjs:3093:33)
at injectInjectorOnly (core.mjs:1100:40)
at Module.ɵɵinject (core.mjs:1106:60)
at Object._AngularFireAuth_Factory [as factory] (angular-fire-compat-auth.mjs:150:84)
at core.mjs:3219:47
at runInInjectorProfilerContext (core.mjs:866:9)
at R3Injector.hydrate (core.mjs:3218:21)
at R3Injector.get (core.mjs:3082:33)
The problem is if I remove the authguard the app works fine I can log in register users everything so I know the environment is correct. but as soon as I add auth guard I get this error so I suspect its that. I tried asking for help chatGPT without any luck so I hope someone here will now what the problem is.
This is the code I have tried and used:
import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';
import { AngularFireAuth } from '@angular/fire/compat/auth';
import { Observable } from 'rxjs';
import { map, tap } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private afAuth: AngularFireAuth, private router: Router) {}
canActivate(): Observable<boolean> {
return this.afAuth.authState.pipe(
map(user => !!user),
tap(loggedIn => {
if (!loggedIn) {
this.router.navigate(['/login']);
}
})
);
}
}
And this is for routes:
import { Routes } from '@angular/router';
import { AuthGuard } from './auth.guard';
export const routes: Routes = [
{
path: 'home',
loadComponent: () => import('./home/home.page').then(m => m.HomePage),
canActivate: [AuthGuard]
},
{
path: '',
redirectTo: 'login',
pathMatch: 'full'
},
{
path: 'main',
loadComponent: () => import('./pages/main/main.page').then(m => m.MainPage),
canActivate: [AuthGuard]
},
{
path: 'login',
loadComponent: () => import('./pages/login/login.page').then(m => m.LoginPage)
},
{
path: 'register',
loadComponent: () => import('./pages/register/register.page').then(m => m.RegisterPage)
},
];
Here is also for login for example if it helps in anyway:
import { Component, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
import { IonicModule } from '@ionic/angular';
import { AngularFireAuth } from '@angular/fire/compat/auth';
import { Router, RouterModule } from '@angular/router';
import { CoreModule } from 'src/app/core/core.module';
@Component({
selector: 'app-login',
templateUrl: './login.page.html',
styleUrls: ['./login.page.scss'],
standalone: true,
imports: [
CommonModule,
FormsModule,
ReactiveFormsModule,
IonicModule,
CoreModule,
RouterModule
]
})
export class LoginPage implements OnInit {
loginForm!: FormGroup;
constructor(private fb: FormBuilder, private afAuth: AngularFireAuth, private router: Router) { }
ngOnInit() {
this.loginForm = this.fb.group({
email: ['', [Validators.required, Validators.email]],
password: ['', [Validators.required]],
rememberMe: [false]
});
}
async login() {
if (this.loginForm.valid) {
try {
await this.afAuth.signInWithEmailAndPassword(this.loginForm.value.email, this.loginForm.value.password);
this.router.navigate(['/main']);
} catch (error) {
console.error('Login error', error);
}
}
}
}
I tried adding core.module.ts since I am using newer version of angular that uses standalone components. This is that:
import { NgModule } from '@angular/core';
import { AngularFireModule } from '@angular/fire/compat';
import { AngularFireAuthModule } from '@angular/fire/compat/auth';
import { IonicModule } from '@ionic/angular';
import { environment } from 'src/environments/environment';
@NgModule({
imports: [
AngularFireModule.initializeApp(environment.firebase), // Initialize Firebase
AngularFireAuthModule, // Import AngularFireAuthModule
IonicModule.forRoot(), // Ensure IonicModule is imported
],
exports: [
AngularFireModule,
AngularFireAuthModule
]
})
export class CoreModule {}
But nothing worked so I would ask for any help if anybody knows anything. Thanks in advance