Firebase Angular 登録ユーザーのアカウントの削除

#はじめに
環境は以下の通り
・ionic + Firebase(angularfireを使用)
**・Firebase Authentication**を使ったアカウントの削除
・ionicプロジェクトにFirebaseモジュールが入っていることが、前提とする。

#ログインしているユーザーのアカウント削除

まずはシンプルに削除。

```typescript
import { AngularFireAuth } from '@angular/fire/auth';

// 省略

    constructor(
    private afAuth: AngularFireAuth,
  ) {}

// 省略

userDelete() {
    const user = this.afAuth.auth.currentUser;
    user
      .delete()
      .then(() => {
        console.log('アカウントを削除した');
      })
      .catch(error => {
        console.log(error);
      });
  }
```

これでFirebase Authenticationからユーザーを削除できた。

ただし、これはあくまでFirebase Authenticationから削除しただけ。

**CloudFirestoreの中にデータは残ったままだ。**

つはり`users`コレクションの中のユーザードキュメントは残ったまま。。。

CloudFirestoreからも削除したいけど、やり方がわからない・・・。
（誰か教えてくださーい:pray:）

#確認のアラートを出す + Nativeストレージからも削除

重要は処理をアラート無しで実行するのは危険なので、「本当に削除していい？」的なアラートを出す。

ついでにNativeストレージからも削除。

```typescript
import { Component, OnInit } from '@angular/core';
import { User } from '../auth/auth.service';
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestore } from '@angular/fire/firestore';
import { Router } from '@angular/router';
import { AlertController, LoadingController, ToastController } from '@ionic/angular';
import { NativeStorage } from '@ionic-native/native-storage/ngx';

@Component({
  selector: 'app-settings',
  templateUrl: './settings.page.html',
  styleUrls: ['./settings.page.scss']
})
export class SettingsPage implements OnInit {
  private currentUser: User;

  constructor(
    private afAuth: AngularFireAuth,
    private db: AngularFirestore,
    private router: Router,
    private alertCtrl: AlertController,
    private loadingCtrl: LoadingController,
    private nativeStorage: NativeStorage,
    private toastCtrl: ToastController
  ) {}

  ngOnInit() {
    this.afAuth.auth.onAuthStateChanged(user => {
      if (user != null) {
        this.currentUser = user;
      } else {
        this.router.navigateByUrl('/auth');
      }
    });
  }

  async onDelete() {
    const alert = await this.alertCtrl.create({
      header: '本当に削除しますか？',
      message:
        '削除し場合、元に戻す事はできません。それでもよろしいですか？'
      buttons: [
        {
          text: 'キャンセル',
          role: 'cancel',
          handler: blah => {
            console.log('Confirm Cancel: blah');
          }
        },
        {
          text: '削除する',
          cssClass: 'delete-button',
          handler: async () => {
            const loading = await this.loadingCtrl.create({
              message: '削除中です'
            });
            this.presentLoading(loading);
            this.userDelete();
            console.log('削除された');
            loading.dismiss();
          }
        }
      ]
    });
    await alert.present();
  }

  userDelete() {
    const user = this.afAuth.auth.currentUser;
    user
      .delete()
      .then(async () => {
        this.nativeStorage.remove('email_user');
        const toast = await this.toastCtrl.create({
          message: 'アカウントを削除しました',
          duration: 3000
        });
        this.router.navigateByUrl('/auth');
        await toast.present();
      })
      .catch(error => {
        console.log(error);
        const message = '削除できませんでした。通信状況を確認してもう一度お試しください。。。';
        this.showAlert(message + error);
      });
  }

  private showAlert(message: string) {
    this.alertCtrl
      .create({
        header: 'エラーが発生しました',
        message: message,
        buttons: ['OK']
      })
      .then(alertEl => alertEl.present());
  }

  async presentLoading(loading) {
    return await loading.present();
  }
}
```