Okay, maybe I should have added that before. But if it should ever be possible to use the tool online we need a possibility to register new users.
I think typolino should support 3 ways:
- email / password
- email link
- anonymous
Enable Anonymous
This needs to be enabled in the Firebase console.

Registration Page
Now there is no way around a registration page. But to start with, we keep it as simple as possible.
ng g component register
…and register the route. I think we can use the same guard configuration as for the login page.

The template should offer three sections.
<h2>Registrieren</h2>
<div>
<h3>Benutzername und Passwort</h3>
<input [(ngModel)]="email" type="text">
<input [(ngModel)]="password" type="password">
<button (click)="signup()" pButton type="button" label="Anmelden" icon="pi pi-check"></button>
</div>
<div>
<h3>E-Mail Link</h3>
<input [(ngModel)]="email" type="text">
<button (click)="signupEmailLink()" pButton type="button" label="Mit E-Mail Link anmelden"
icon="pi pi-check"></button>
</div>
<div>
<h3>Anonymer Zugriff</h3>
<button (click)="signupAnonymous()" pButton type="button" label="Anonym anmelden" icon="pi pi-check"></button>
</div>
Anonymous login
The anonymous login is super simple to implement.
signupAnonymous() {
this.fireAuth.signInAnonymously().then(() => {
this.navigationService.showLessons();
});
}
Email / Password
This one is also quite easy. After creating the user you are already part of the Typolino family.
signup() {
this.fireAuth
.createUserWithEmailAndPassword(this.email, this.password)
.then(() => {
this.navigationService.showLessons();
});
}
Email link
Never used that one before. But it requires some extra steps. First of all sending the link via mail (we will cleanup the localStorage part later):
signupEmailLink() {
const actionCodeSettings = {
url: 'https://typolino.web.app/completeSignup',
handleCodeInApp: true,
};
this.fireAuth
.sendSignInLinkToEmail(this.email, actionCodeSettings)
.then(() => {
window.localStorage.setItem('emailForSignIn', this.email);
});
}
The user should get an email to complete the registration. This way he confirms to be the owner of the email address. To complete the registration we need to provide a URL to be invoked. For this we create a new component, provide the route and implement a simple forward operation in case the registration was successful.
ng g component complete-signup
Register the route:
{
path: 'completeSignup',
component: CompleteSignupComponent,
canActivate: [AngularFireAuthGuard],
data: { authGuardPipe: redirectLoggedInToLessons }
},
…and the actual signup completion, simple version without proper error handling:
import { Component, OnInit } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/auth';
import { NavigationService } from '../navigation.service';
@Component({
selector: 'app-complete-signup',
templateUrl: './complete-signup.component.html',
styleUrls: ['./complete-signup.component.less'],
})
export class CompleteSignupComponent implements OnInit {
constructor(
private fireAuth: AngularFireAuth,
private navigationService: NavigationService
) {}
ngOnInit(): void {
this.fireAuth
.isSignInWithEmailLink(window.location.href)
.then((isSignInWithEmailLink) => {
if (isSignInWithEmailLink) {
const email = window.localStorage.getItem('emailForSignIn');
this.fireAuth
.signInWithEmailLink(email, window.location.href)
.then((result) => {
window.localStorage.removeItem('emailForSignIn');
this.navigationService.showLessons();
})
.catch((error) => {
console.log(error);
});
}
});
}
}
Done
We added three different ways to register to Typolino in less than an hour. What I really like most about Firebase is that it never gives me the feeling of just importing magic – I always feel in full control of the application. Next we will add some logic to keep track over the completion / progress of each individual user.